awk:从行模式访问捕获的组

如果我有一个awk命令

pattern { ... } 

和模式使用一个捕获组,我怎样才能访问在块中捕获的string?

这是一个漫步在记忆巷…

很久以前我用perlreplace了awk。

显然,AWK正则expression式引擎不捕获它的组。

你可以考虑使用像这样的东西:

 perl -n -e'/test(\d+)/ && print $1' 

-n标志会导致perl循环遍历每一行,比如awk。

使用gawk,您可以使用matchfunction来捕获带括号的组。

 gawk 'match($0, pattern, ary) {print ary[1]}' 

例:

 echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}' 

输出cd

请注意实现相关function的gawk的具体用法。

对于一个可移植的替代品,你可以用match()substr来获得类似的结果。

例:

 echo "abcdef" | awk 'match($0, /b[^e]*/) {print substr($0, RSTART+1, RLENGTH-1)}' 

输出cd

这是我一直需要的东西,所以我创build了一个bash函数。 这是基于格伦·杰克曼的回答。

定义

添加到您的.bash_profile等

 function regex { gawk 'match($0,/'$1'/, ary) {print ary['${2:-'0'}']}'; } 

用法

捕获文件中每一行的正则expression式

 $ cat filename | regex '.*' 

为文件中的每一行捕获第一个正则expression式捕获组

 $ cat filename | regex '(.*)' 1 

你可以使用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/ 

你也可以模拟在香草awk捕获,没有扩展。 虽然它不直观:

第1步。使用gensub环绕匹配与不出现在您的string中的某些字符。 步骤2.使用拆分字符。 步骤3.拆分数组中的每个其他元素都是您的捕获组。

 $ echo'ab cb ad'|  awk'{split(gensub(/ a ./,SUBSEP&&SUBSEP,“g”,$ 0),cap,SUBSEP); 打印帽子[2]“|”  [4];  }”
 AB |广告

我挣扎了一下,想出一个包装Peter Tillemans的答案的bash函数,但是这里是我想到的:

函数正则expression式{perl -n -e“/ $ 1 / && printf \”%s \ n \“,”'$ 1'}

我发现这比opsb基于awk的bash函数更适合下面的正则expression式参数,因为我不想打印“ms”。

 '([0-9]*)ms$'