sed 字边界,在 macOS 上

ABC*_*ABC 10 sed regular-expression macos

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

sed 's/\<cat\>/dog/g' tt.txt
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 15

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

文件本身不会改变

sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt
Run Code Online (Sandbox Code Playgroud)

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

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

sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt >tt.txt-new
Run Code Online (Sandbox Code Playgroud)

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

sed 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt >tt.txt-new && mv tt.txt-new tt.txt
Run Code Online (Sandbox Code Playgroud)

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

sed -i '' 's/[[:<:]]cat[[:>:]]/dog/g' tt.txt
Run Code Online (Sandbox Code Playgroud)

尽管手册上说:

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


Ant*_*hon -1

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

 sed 's/<cat>/dog/g' tt.txt
Run Code Online (Sandbox Code Playgroud)

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