为什么 sed 替换所有出现的而不是仅第一次出现?

sat*_*dev 5 sed

我正在尝试使用以下命令替换文件中的第一次出现sed

sed -i s/he/He/ dummy.txt
Run Code Online (Sandbox Code Playgroud)

它不是替换第一次出现,而是替换所有出现,即使没有/g.

根据文档,它应该只替换第一个。

sed版本是:

GNU sed version 4.1.5
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?或者不同sed实现的行为是否不同?

cho*_*oba 5

sed 逐行处理输入。修饰符/g会影响它是替换一行中所有出现的内容,还是仅替换第一个:

echo hehe | sed s/h/H/
echo hehe | sed s/h/H/g
Run Code Online (Sandbox Code Playgroud)

要仅替换文件中的第一个匹配项,请使用如下所示的内容:

s/h/H/            # Replace.
ta                # Go to a if s/// worked.
b                 # Otherwise, start the next cycle.
:a { n            # Process the next line.
     ba           # Go to a.
}
Run Code Online (Sandbox Code Playgroud)