基本的に、入力がフィルターに一致する場合に出力を変更するだけですが、変更される部分はフィルターされる部分ではありません (そうでない場合は を使用しますsed
)。これまでのところ、問題は、 my がawk
変更された行のみを出力していることです。
簡単な例として、これを test.txt に記述します。
orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk
次のコードを使用する場合:
awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt
次のような結果になります:
orange beet pear cow~milk
orange melon cherry cow~milk
私がむしろ得たいのは:
orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk
awk を使用できることを確認でき||
ましたが、それを上記の gsub に適合させる方法がわかりません。
ボーナスの鑑賞のために、私が本当にやりたいのは、 の代わりに色を追加することですが~
、それは完全に壊れています。
awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt
\
行の終わりではないというエラーが表示されます。
答え1
色については、実際の ESC 文字 (エスケープされた形式ではない\e
) を指定する必要があります。値は 16 進数\x1B
または 8 進数です\033
。次のスクリプトは、ダッシュに色を付け-
、すべての入力行を印刷します。
awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"
sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"
答え2
いくつかの行のみを変更した後に各行を印刷するには、( 1
) のように常に true と評価される別の条件を追加します。
awk '/orange/{gsub("cow", "cow~")} 1' "$file"
明示的に次のようにすることもできます{print}
:
awk '/orange/{gsub("cow", "cow~")} {print}' "$file"
各 awk ステートメントは条件とステートメント句で構成されていることに注意してください。
condition {statements}
ただし、これらはオプションであり、{statements}
の場合、{print}
が使用されます。condition
、その後が1
使用されます。