Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 有人能解释一下为什么是awk';s sub()/gsub()是这样工作的?_Linux_Shell_Awk - Fatal编程技术网

Linux 有人能解释一下为什么是awk';s sub()/gsub()是这样工作的?

Linux 有人能解释一下为什么是awk';s sub()/gsub()是这样工作的?,linux,shell,awk,Linux,Shell,Awk,我知道awk可以使用sub()和gsub()进行文本/字符串替换,比如: kent$ echo "fffff"|awk '{gsub("f", "b")}1' bbbbb 或 但是今天我犯了一个打字错误,我写了这样一行: kent$ echo "fffff"|awk '{gsub('f', "b")}1' 但是awk没有对此抱怨,而是像往常一样生成了输出,当然是意外的输出,我花了一些时间才发现错误。awk给我的输出是: bfbfbfbfbfb 另一个例子: kent$ echo "fafa

我知道
awk
可以使用
sub()
gsub()
进行文本/字符串替换,比如:

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
编辑

谢谢乔尼的回答。也许这个例子解释得更好,我只是在这里加上:

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

我认为这可能是一个可以使用的伎俩,即使这有点冒险。:)
echo "fffff"|awk '{gsub(//, "b")}1'            # fbfbfbfbfb