基本上,我想做的就是在輸入與過濾器匹配時改變輸出,但被改變的部分不是被過濾的部分(或者我會使用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
使用。