我知道 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
最佳答案
当你写作时
echo "fffff"|awk '{gsub('f', "b")}1'
awk 看到的是 {gsub(f, "b")}1
。它将 f
解释为具有空值的变量,并将输入中的每个 空字符串 替换为 b。
在每个字符之间和最后一个字符之后发现空字符串,因此 awk 在每个 f
之后插入一个 b
。
您可以用 //
或 ""
代替,但没有未使用的变量:
echo "fffff"|awk '{gsub(//, "b")}1' # fbfbfbfbfb
关于linux - 有人能解释一下为什么 awk 的 sub()/gsub() 是这样工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434564/