linux - 有人能解释一下为什么 awk 的 sub()/gsub() 是这样工作的吗?

标签 linux shell awk

我知道 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/

相关文章:

linux - 在多个 Shell 脚本中执行相同的命令

linux - Bash 命令 : export BLAS_LIBS ="-L$LAPACKHOME/lib -lblas"

node.js - 安装 ts-java 等 Node 包并不断出现 node-gyp 问题

linux - 是否可以使用 shell 脚本递归地创建文件夹?

bash - 设置 svn :ignore recursively for a directory structure

linux - Linux中具有相同虚拟和物理地址空间的两个进程(共享大页)

bash - 崩溃时自动重启 SH 脚本?

bash - 带和不带关键字的 shell 函数定义

regex - 在文件中查找函数并打印其内容的命令

regex - 更改匹配行中的单词