我怎样才能让 awk 打印匹配和不匹配?

Ken*_* Oh 4 bash awk

基本上,如果输入与过滤器匹配,我想要做的就是改变输出,但被改变的部分不是被过滤的部分(或者我会使用sed)。到目前为止的问题是我awk只输出更改后的行。

快速示例,将其放在 test.txt 中:

orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk
Run Code Online (Sandbox Code Playgroud)

如果我使用代码:

awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt
Run Code Online (Sandbox Code Playgroud)

我得到:

orange beet pear cow~milk
orange melon cherry cow~milk
Run Code Online (Sandbox Code Playgroud)

当我宁愿得到:

orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk
Run Code Online (Sandbox Code Playgroud)

我知道您可以||使用 awk,但我一直无法弄清楚如何使其适合上面的 gsub。

对于奖金升值,我真正想做的是添加颜色而不是~,但这完全中断,即

awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt
Run Code Online (Sandbox Code Playgroud)

给我一个关于\不是行尾的错误。

Pet*_*r.O 8

对于颜色,您需要指定实际的 ESC 字符(不是转义形式\e)。值是 hex\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"
Run Code Online (Sandbox Code Playgroud)


Arc*_*ege 5

要在仅修改几行后打印每一行,请添加一个始终评估为 true 的单独条件,例如 ( 1):

awk '/orange/{gsub("cow", "cow~")} 1' "$file"
Run Code Online (Sandbox Code Playgroud)

你也可以{print}明确地:

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"
Run Code Online (Sandbox Code Playgroud)

请记住,每个 awk 语句都由一个条件和一个语句子句组成:

condition {statements}
Run Code Online (Sandbox Code Playgroud)

但是这些都是可选的,如果不包含{statements},则{print}使用。如果不包括condition,则1使用 。