16

我知道可以用和喜欢awk做文本/字符串替换:sub()gsub()

kent$ echo "fffff"|awk '{gsub("f", "b")}1'
bbbbb

或者

kent$ echo "fffff"|awk '{gsub(/f/, "b")}1'
bbbbb

但是今天我犯了一个拼写错误,我把这行写成:

kent$ echo "fffff"|awk '{gsub('f', "b")}1'

但是awk并没有抱怨,而是像往常一样生成了输出,当然,意外的输出,我花了一些时间才发现错误。输出awk给我的是:

bfbfbfbfbfb

另一个例子:

kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1'
BfBaBfBaBfBaBfBaBfBXBXB

的例子sub()也很奇怪:

kent$  echo "thanks in advance"|awk '{sub('a', "B")}1'
Bthanks in advance

有人可以解释一下奇怪的替换是如何完成的吗?

kent$  awk --version
GNU Awk 4.0.2

编辑

感谢 Joni 的回答。也许这个例子能更好地解释它,我只是在这里添加它:

kent$  echo "thanks in advance"|awk '{f="k";sub('f', "B")}1'
thanBs in advance

kent$  echo "thanks in advance"|awk '{sub('th ank', "B")}1'
awk: cmd. line:2: {sub(th
awk: cmd. line:2:        ^ unexpected newline or end of string
4

1 回答 1

22

当你写

echo "fffff"|awk '{gsub('f', "b")}1'

awk 看到的是{gsub(f, "b")}1. 它解释f为一个具有空值的变量,并将输入中的每个空字符串替换为 b。

空字符串位于每个字符之间和最后一个字符之后,因此 awk 在每个字符之后插入b一个f

您可以替换//""以获得相同的效果,而无需使用未使用的变量:

echo "fffff"|awk '{gsub(//, "b")}1'            # fbfbfbfbfb
于 2013-03-15T14:21:51.003 回答