Chris Downは、ブロック内で明示的な 'if'ステートメントを使用して正規表現のelseを取得する方法を既に示しました。他の方法でも同じ効果を得ることができますが、おそらく彼の解決策の方が優れています。
1つは、他のテキストと一致しないテキストのみに一致する3番目の正規表現を記述することです。この場合、これは次のようになります。
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
これはアンカーされた正規表現を使用することに注意してください-正規表現の先頭の^は行の先頭でのみ一致します-元のパターンはこれをしませんでしたが、行のすべての文字をチェックするので次の行までスキップします。3番目(「else」)の場合は、「R」ではない文字([^ R])で始まる行、または「R」で始まり「1」または「 2 '(R [^ 12])。^の2つの異なる意味はやや混乱しますが、その間違いはかなり前に行われたものであり、すぐには変更されません。
補完的な正規表現を使用するには、それらを実際に固定する必要があります。そうしないと、[^ R]が後続の1などと一致します。あなたのような非常に単純な正規表現の場合、このアプローチは有用ですが、正規表現がより複雑になると、このアプローチは管理できなくなります。代わりに、次のように各行に状態変数を使用できます。
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
これは、新しい行ごとに処理をゼロに設定し、2つの正規表現のいずれかに一致する場合は1に設定し、最後に、まだゼロの場合は、印刷$ 0を実行します。