有人可以解释一下为什么awk的sub()/ gsub()会像这样工作吗?

Ken*_*ent 15 linux shell awk

我知道awk可以做文本/字符串替换与sub()gsub()这样的:

kent$ echo "fffff"|awk '{gsub("f", "b")}1'
bbbbb
Run Code Online (Sandbox Code Playgroud)

要么

kent$ echo "fffff"|awk '{gsub(/f/, "b")}1'
bbbbb
Run Code Online (Sandbox Code Playgroud)

然而今天我犯了一个拼写错误,我写道:

kent$ echo "fffff"|awk '{gsub('f', "b")}1'
Run Code Online (Sandbox Code Playgroud)

但是awk并没有抱怨那个但是像往常一样产生输出,当然是意外的输出,我花了一些时间来找出错误.输出awk给了我:

bfbfbfbfbfb
Run Code Online (Sandbox Code Playgroud)

另一个例子:

kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1'
BfBaBfBaBfBaBfBaBfBXBXB
Run Code Online (Sandbox Code Playgroud)

例子sub()也很奇怪:

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

有人可以解释一下奇怪的替换怎么办?

kent$  awk --version
GNU Awk 4.0.2
Run Code Online (Sandbox Code Playgroud)

编辑

感谢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
Run Code Online (Sandbox Code Playgroud)

Jon*_*oni 21

当你写作

echo "fffff"|awk '{gsub('f', "b")}1'
Run Code Online (Sandbox Code Playgroud)

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

空字符串的每个字符之间,最后一个后发现,所以AWK插入b每个之后f.

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

echo "fffff"|awk '{gsub(//, "b")}1'            # fbfbfbfbfb
Run Code Online (Sandbox Code Playgroud)