代码之家  ›  专栏  ›  技术社区  ›  rampion

awk:从线条模式访问捕获的组

  •  194
  • rampion  · 技术社区  · 14 年前

    如果我有一个awk命令

    pattern { ... }
    

    模式使用一个捕获组,如何访问在块中捕获的字符串?

    6 回复  |  直到 6 年前
        1
  •  138
  •   Peter Tillemans    13 年前

    那是一条记忆的小路…

    很久以前我用Perl代替了awk。

    显然,awk正则表达式引擎不捕获其组。

    您可能会考虑使用如下内容:

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

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

        2
  •  277
  •   Thor    7 年前

    用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)}'
    

    输出 光盘 .

        3
  •  27
  •   opsb    12 年前

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

    定义

    将此添加到.bash_配置文件等。

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

    用法

    为文件中的每一行捕获regex

    $ cat filename | regex '.*'
    

    为文件中的每一行捕获第一个regex捕获组

    $ cat filename | regex '(.*)' 1
    
        4
  •  12
  •   Isvara    12 年前

    您可以使用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/
    
        5
  •  3
  •   ydrol    12 年前

    您也可以在普通锥子中模拟捕获,不需要扩展。但这并不直观:

    步骤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
    
        6
  •  0
  •   wytten    8 年前

    我有点纠结于想出一个包含彼得·蒂勒曼答案的bash函数,但我想到的是:

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

    对于下面的正则表达式参数,我发现这比opsb基于awk的bash函数更有效,因为我不希望打印“ms”。

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