基本上,如果输入与过滤器匹配,我想要做的就是改变输出,但被改变的部分不是被过滤的部分(或者我会使用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)
给我一个关于\
不是行尾的错误。
对于颜色,您需要指定实际的 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)
要在仅修改几行后打印每一行,请添加一个始终评估为 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
使用 。