一致と一致しない項目を印刷するにはどうすればよいですか?

一致と一致しない項目を印刷するにはどうすればよいですか?

基本的に私がしたいのは、入力がフィルタと一致するときに出力を変更することですsed。これまでの問題は、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使用してください。

関連情報