【发布时间】:2021-06-08 22:09:46
【问题描述】:
有人能解释一下为什么会按预期工作吗:echo "one\ntwo\nthree\n" | awk '{if (gsub(/one/,"")) { print } else {print $0}}'
two
three
echo "one\ntwo\nthree\n" | awk '{if (gsub(/four/,"")) { print } else {print $0}}'
one
two
three
但这不是吗?echo "one\ntwo\nthree\n" | awk '{if (gsub(/one/,"")) { print }}'
类似地,如果尝试链接多个替换,则要求所有替换发生的次数都返回非零,然后才打印更改后的结果,否则打印原始内容:echo "one\ntwo\nthree\n" | awk '{if (gsub(/one/,"") && gsub(/two/,"")) { print } else {print $0}}'
我得到:
two
three
我期望的地方:
three
我在这里缺少什么?来自任何其他编程语言,我希望这能够“正常工作”。请注意,我在 BSD 和 GNU awk 中观察到相同的行为。
编辑:
我认为这与 awk 如何处理多行输入有关:
echo "one\ntwo\nthree\n" | awk '{if (gsub(/one/,"")) print "found"; else print "not found" }'
found
not found
not found
not found
【问题讨论】:
-
给定
echo "one\ntwo\nthree\n",您的echo输出版本是什么?大多数将完全输出带有文字\s 和ns 的字符串。如果您想在所有系统上的每个单词之间输出换行符(因此您的问题很清楚),请改用printf 'one\ntwo\nthree\n'。
标签: if-statement awk logical-operators logical-and