如果我有一个awk命令
pattern { ... }
和模式使用捕获组,我怎么能访问字符串,所以在块捕获?
如果我有一个awk命令
pattern { ... }
和模式使用捕获组,我怎么能访问字符串,所以在块捕获?
当前回答
我在提出一个bash函数来包装Peter Tillemans的答案时遇到了一些困难,但下面是我想到的:
函数的正则表达式 { Perl -n -e "/$1/ && printf \"%s\n\", " $1 " }
对于下面的正则表达式参数,我发现这比opsb基于awk的bash函数工作得更好,因为我不想打印“ms”。
'([0-9]*)ms$'
其他回答
我在提出一个bash函数来包装Peter Tillemans的答案时遇到了一些困难,但下面是我想到的:
函数的正则表达式 { Perl -n -e "/$1/ && printf \"%s\n\", " $1 " }
对于下面的正则表达式参数,我发现这比opsb基于awk的bash函数工作得更好,因为我不想打印“ms”。
'([0-9]*)ms$'
注意:gensub的使用不是POSIX兼容的
您也可以在vanilla awk中模拟捕获,不需要扩展。这并不直观:
步骤1。使用gensub将匹配的字符串与一些不出现在字符串中的字符包围起来。 步骤2。对角色使用分裂。 步骤3。拆分数组中的其他每个元素都是捕获组。
$ echo 'ab cb ad' | awk '{ split(gensub(/a./,SUBSEP"&"SUBSEP,"g",$0),cap,SUBSEP); print cap[2]"|" cap[4] ; }' ab|ad
你可以使用GNU awk:
$ cat hta
RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]
$ gawk 'match($0, /.*(http.*?)\$/, m) { print m[1]; }' < hta
http://www.mysite.net/
在gawk中,您可以使用match函数来捕获括号中的组。
gawk 'match($0, pattern, ary) {print ary[1]}'
例子:
echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}'
输出的cd。
注意gawk的具体用法,它实现了所讨论的特性。
对于可移植的替代方案,您可以使用match()和substr实现类似的结果。
例子:
echo "abcdef" | awk 'match($0, /b[^e]*/) {print substr($0, RSTART+1, RLENGTH-1)}'
输出的cd。
这是我一直需要的东西,所以我为它创建了一个bash函数。这是基于格伦·杰克曼的答案。
定义
将此添加到您的.bash_profile等。
function regex { gawk 'match($0,/'$1'/, ary) {print ary['${2:-'0'}']}'; }
使用
捕获文件中每一行的正则表达式
$ cat filename | regex '.*'
为文件中的每一行捕获第一个正则表达式捕获组
$ cat filename | regex '(.*)' 1