如何让 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使用。

相关内容