我有这条线
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'