我想在我的代码中将willow
替换为oak
。此更改需要对不同级别的多个文件进行。
我尝试使用以下答案:如何用awk或sed进行递归查找/替换字符串?
特别是,grep -rl willow . | xargs sed -i -e '' 's/willow/oak/g'
由于我使用的是Mac(来自:sed -i命令用于就地编辑以使用GNU sed和BSD/OSX),我使用了额外的-e ''
命令。然而,我得到
s/willow/oak/g: No such file or directory
我也试过了:
grep -rl willow . | xargs sed -i '' 's/willow/oak/g'
(由于操作系统)给出:sed: RE错误:非法字节序列。
我如何递归地遍历Mac上不同字典中的所有文件来替换柳树的所有实例?
grep -rl willow . | xargs sed -i -e '' 's/willow/oak/g'
我使用了额外的-e "命令。
你误解了你得到那个想法的答案,制造了一个额外的问题,而不是解决一个问题。使用该命令,MacOSsed
不仅将-e
解释为备份文件的扩展名,将's/willow/oak/g'
解释为输入文件名,而且还将''
解释为(零长度)文件名。后者是您的错误消息的内容。
我也试过了:
grep -rl willow . | xargs sed -i '' 's/willow/oak/g'
根据其手册页,如果您在Macsed
中使用-i
或-f
选项,那么如果您想通过命令行指定命令,则必须使用-e
。也就是说,你需要这样做:
grep -rl willow . | xargs sed -i '' -e 's/willow/oak/g'
为-i
指定一个空的备份扩展名,从而抑制备份文件的生成,并通过-e
在命令行上指定sed
命令。