我运行以下命令以查找并替换为新的网址。
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
。