基本上,我想做的就是在输入与过滤器匹配时改变输出,但被改变的部分不是被过滤的部分(或者我会使用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
使用。