如果我有一个awk命令

pattern { ... }

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


当前回答

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

定义

将此添加到您的.bash_profile等。

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

使用

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

$ cat filename | regex '.*'

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

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

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

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

定义

将此添加到您的.bash_profile等。

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

使用

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

$ cat filename | regex '.*'

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

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