これを除いて、入力ファイル内の正規表現に一致するすべての行に番号を付けたいと思います。元:
入力ファイル:
some text 12345
some another text qwerty
my special line
blah foo bar
正規表現:^ my
出力:
1 some text 12345
2 some another text qwerty
my special line
3 blah foo bar
awk
それはかなり簡単にできます。Awkスクリプト:
!/^my/ {
cnt++;
printf "%d ", cnt
}
{
print
}
つまり、式に一致しないすべての行について、変数cnt
(ゼロから始まる)をインクリメントし、その数値の後にスペースを出力します。次に、行全体を印刷します。
デモ:
$ awk '!/^my/{cnt++; printf "%d ", cnt} {print}' input
1 some text 12345
2 some another text qwerty
my special line
3 blah foo bar
Thorのおかげで凝縮されたバージョン:
$ awk '!/^my/{$0=++cnt" "$0} 1' input
$0
これは、行が式と一致しない場合に行全体()を変更することで機能します(事前にインクリメントされたカウンターを追加します)。最初のペア
の後は、それ自体がアクション部分が省略されたペアです。は常にtrueであるため、アクションは常に実行され、何も指定されていない場合のデフォルトのアクションはです。また、引数なしのリストは、と同等です。つまり、行全体を出力します。1
pattern{action}
pattern{action}
1
{print}
print
print $0