10

パターンが 1 行で複数回一致する場合、一致するすべてのグループに対してアクションを実行するにはどうすればよいですか?

説明のために、数字を検索し/Hello! (\d+)/て使用します。たとえば、数字を印刷したり合計したりします。

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

それらを印刷することにした場合、次の出力が期待されます

200
400
0
4

4 に答える 4

13

これは単純な構文であり、すべての 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);
    }
}
于 2009-07-13T09:54:29.943 に答える
2

これがgawk構文です。また、レコード区切りとして機能する固定テキストがなく、改行を超えて一致しない場合のパターンでも機能します。

 {
     pattern = "([a-g]+|[h-z]+)"
     while (match($0, pattern, arr))
     {
         val = arr[1]
         print val
         sub(pattern, "")
     }
 }
于 2009-07-12T16:20:03.713 に答える
0

同じパターンを1行に複数回一致させる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

于 2009-07-27T07:05:49.860 に答える