我知道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
答案 0 :(得分:20)
写作时
echo "fffff"|awk '{gsub('f', "b")}1'
awk看到的是{gsub(f, "b")}1
。它将f
解释为变量,使用空值,并用b替换输入中的每个空字符串。
在每个字符之间和最后一个字符之后找到空字符串,因此awk在每个b
之后插入f
。
您可以将//
或""
替换为相同的效果,而不使用未使用的变量:
echo "fffff"|awk '{gsub(//, "b")}1' # fbfbfbfbfb