sed 字边界,在 macOS 上

sed 字边界,在 macOS 上

我使用的是 macOS,我想使用以下sed命令查找给定单词并将其替换为另一个单词,但它没有进行任何更改。问题是什么?

sed 's/\<cat\>/dog/g' tt.txt

答案1

sed在 macOS 上使用[[:<:]]代替\<[[:>:]]代替\>.另外, macOS 实现sed不支持\b单词边界模式。即使sed(1)macOS 上的手册提到的re_format(7)提及\<\>、 和\b

文件本身不会改变

sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt

唯一发生的事情是sed读取文件并将表达式应用到每个输入行。然后它将转换后的数据写入标准输出。

要将输出保存到新文件,请使用

sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt >tt.txt-new

然后,您可以用新数据替换原始文件:

sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt >tt.txt-new && mv tt.txt-new tt.txt

在 macOS 上,您还应该能够使用以下命令就地执行转换

sed -i '' 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt

尽管手册上说:

不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下可能会出现损坏或部分内容的风险。

答案2

只要您的文本具有准确的顺序,\<cat\>就应该将其替换。但我认为它只有<cat>这样的尝试:

 sed 's/<cat>/dog/g' tt.txt

单引号防止解释它们之间的任何字符。

答案3

您应该-i在 sed 之后添加来编辑文件,例如:

sed -i 's/cat/dog/g' tt.txt

它应该可以完美地工作。

相关内容