如何讓 awk 列印匹配項和不匹配項?

如何讓 awk 列印匹配項和不匹配項?

基本上,我想做的就是在輸入與過濾器匹配時改變輸出,但被改變的部分不是被過濾的部分(或者我會使用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。以下腳本為破折號著色並列印所有輸入行 \x1B\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

若要在僅修改幾行後列印每一行,請新增一個始終評估為 true 的單獨條件,例如 ( 1):

awk '/orange/{gsub("cow", "cow~")} 1' "$file"

您還可以{print}明確:

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"

請記住,每個 awk 語句都包含一個條件和一個語句句:

condition {statements}

但如果您不包括其中每一項都是可選的{statements},然後{print}使用。如果您不包括condition,然後1使用。

相關內容