对 sed -i 的调用有什么问题?

对 sed -i 的调用有什么问题?

我有这条线

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 sed -i 's/AAA/BBB/g'

我的目的是从当前目录递归地将所有文件中所有出现的 AAA 更改为 BBB,但具有以下扩展名的文件除外:.plist、.mp4 和 .DS*

但我收到消息

sed: 1: "./myDir/pro ...": invalid command code .

答案1

最简单的解决方案是使用这个:

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e  's/AAA/BBB/g'

答案2

与 GNU sed 不同,Mac OSX 附带的 sed 需要选项的参数-i,指定备份后缀;要抑制备份,您必须传递一个空字符串 ( '')。因此,sed 将 your 解释s/AAA/BBB/为备份后缀,并将您的第一个文件名 ( ./myDir/pro ...) 作为要执行的命令。当然,.这不是一个有效的 sed 命令,导致了错误。记住这一点,以下方法将起作用:

find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'

或者,如果您坚持抑制备份

find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'

相关内容