![为什么 sed 替换所有出现的位置而不是仅替换第一个出现的位置?](https://linux22.com/image/67341/%E4%B8%BA%E4%BB%80%E4%B9%88%20sed%20%E6%9B%BF%E6%8D%A2%E6%89%80%E6%9C%89%E5%87%BA%E7%8E%B0%E7%9A%84%E4%BD%8D%E7%BD%AE%E8%80%8C%E4%B8%8D%E6%98%AF%E4%BB%85%E6%9B%BF%E6%8D%A2%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%87%BA%E7%8E%B0%E7%9A%84%E4%BD%8D%E7%BD%AE%EF%BC%9F%20.png)
我正在尝试使用以下命令替换文件中的第一个匹配项sed
:
sed -i s/he/He/ dummy.txt
它不是替换第一个出现的位置,而是替换所有出现的位置,即使没有/g
.
根据文档,它应该仅替换第一个。
版本sed
是:
GNU sed version 4.1.5
我错过了什么吗?或者不同的实现的行为是否不同sed
?
答案1
sed 逐行处理输入。修饰符/g
会影响它是替换一行中所有出现的内容,还是仅替换第一个:
echo hehe | sed s/h/H/
echo hehe | sed s/h/H/g
要仅替换文件中的第一个匹配项,请使用如下所示的内容:
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.
}