パターンが 1 行で複数回一致する場合、一致するすべてのグループに対してアクションを実行するにはどうすればよいですか?
説明のために、数字を検索し/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, "")
}
}
同じパターンを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