如果我有一个awk命令

pattern { ... }

和模式使用捕获组,我怎么能访问字符串,所以在块捕获?


当前回答

那是在回忆的小路上漫步……

很久以前,我用perl替换了awk。

显然,AWK正则表达式引擎没有捕获它的组。

你可以考虑使用这样的代码:

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

-n标志使perl像awk一样遍历每一行。

其他回答

注意: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/

我在提出一个bash函数来包装Peter Tillemans的答案时遇到了一些困难,但下面是我想到的:

函数的正则表达式 { Perl -n -e "/$1/ && printf \"%s\n\", " $1 " }

对于下面的正则表达式参数,我发现这比opsb基于awk的bash函数工作得更好,因为我不想打印“ms”。

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

那是在回忆的小路上漫步……

很久以前,我用perl替换了awk。

显然,AWK正则表达式引擎没有捕获它的组。

你可以考虑使用这样的代码:

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

-n标志使perl像awk一样遍历每一行。

在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。