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