在小牛队上运行查找和 sed 后"invalid command code ." sed 的错误



我运行以下命令以查找并替换为新的网址。

find . -type f -print0 | xargs -0 sed -i 
's/http://www.oldwebaddress.com/techblog/https://github.com/myname/g'

但是我会收到以下错误。

sed: 1: "./.DS_Store": invalid command code .

我在阅读了一些堆栈溢出帖子后尝试了这个,但也没有起作用。

find . -type f -print0 | xargs -0 sed -i "" 
's/http://www.oldwebaddress.com/techblog/https://github.com/myname/g'
sed: RE error: illegal byte sequence

我在这里做错了什么?

Mac OS X上的sed接受-i选项,但需要一个参数,即用于备份文件的后缀。它不是可选的,因为GNU sed是可选的。因此,sed脚本试图将您的s///命令用作后缀,然后第一个文件名并不是有效的sed命令。

对于第二次尝试,使用-i "",这还不太清楚发生了什么。我认为""之后有后斜线,或者整个地段确实在一行上,因此在语法上是正确的。

在编辑路径名时,使用/以外的某些字符作为分离器会更简单。通常,%有效:

-e 's%http://www.oldwebaddress.com/techblog%https://github.com/myname%g'

但是您可以使用任何字符; control-a 控制g 也非常有效,甚至不太可能出现在%中。

我不清楚为什么您会收到RE错误(无效的字节序列)。从问题中复制和粘贴并没有显示出问题,而引用的另一个问题建议LANG=C LC_CTYPE=C,但我没有遇到LANG=en_US.UTF-8的问题,而没有设置LC_CTYPE的问题。

这有帮助吗?

另外,如果您只做-print而不是-print0,则可以用xargs替换xargs -0

您也可以考虑使用perl而不是BSD sed

find . -type f -print | xargs perl -pi.bak -e 's/http://www.oldwebaddress.com/techblog/https://github.com/myname/g'

上面应进行替换并保存所有文件备份,并在文件名的末尾添加.bak。如果您不希望创建备份,请使用perl -pi -e

最新更新