我使用的是 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
它应该可以完美地工作。