簡體   English   中英

awk從每一行中提取多個組

[英]awk extract multiple groups from each line

當模式在一行中多次匹配時,如何對所有匹配的組執行操作?

為了說明,我想搜索/Hello! (\\d+)/ /Hello! (\\d+)/並使用數字,例如,打印出來或將它們相加,以便輸入

abcHello! 200 300 Hello! Hello! 400z3
ads
Hello! 0

如果我決定將它們打印出來,我會期待它的輸出

200
400
0

這是一個簡單的語法,每個awk(nawk,mawk,gawk等)都可以使用它。

{
    while (match($0, /Hello! [0-9]+/)) {
        pattern = substr($0, RSTART, RLENGTH);
        sub(/Hello! /, "", pattern);
        print pattern;
        $0 = substr($0, RSTART + RLENGTH);
    }
}

這是gawk語法。 當沒有固定文本可以作為記錄分隔符並且不符合換行符時,它也適用於模式:

 {
     pattern = "([a-g]+|[h-z]+)"
     while (match($0, pattern, arr))
     {
         val = arr[1]
         print val
         sub(pattern, "")
     }
 }

GNU awk

awk 'BEGIN{ RS="Hello! ";}
{
    gsub(/[^0-9].*/,"",$1)
    if ($1 != ""){ 
        print $1 
    }
}' file

沒有gawk函數可以在一行中多次匹配相同的模式。 除非您確切知道該模式重復的次數。

有了這個,你必須在同一行的所有匹配上“手動”迭代。 對於您的示例輸入,它將是:

{
  from = 0
  pos = match( $0, /Hello! ([0-9]+)/, val )
  while( 0 < pos )
  {
    print val[1]
    from += pos + val[0, "length"]
    pos = match( substr( $0, from ), /Hello! ([0-9]+)/, val )
  }
}

如果模式匹配換行符,則必須修改輸入記錄分隔符 - RS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM