2014-01-31 27 views
1

我运行以下命令以查找并替换旧网址到新的网址。。在小牛上运行查找和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 . 

我在阅读Stack Overflow的一些帖子后尝试了这一个,但也没有工作。

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 

我在这里做错了什么?

回答

1

请问this有帮助吗?

此外,如果你只是做-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

1

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

对于第二次尝试,与-i "",它不是很清楚发生了什么。我假设在""之后有一个反斜杠,或者整个批次真的在一行上,所以它在语法上是正确的。

编辑路径名时,使用除/以外的字符作为分隔符比较简单。通常,%的作品:

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

但你可以使用任何字符; Control-AControl-G也非常有效,甚至更不可能出现在URL中而不是%

但是,我不清楚为什么你会得到RE错误(无效的字节序列)。从问题复制和粘贴不会显示问题,并且其他question引用建议LANG=C LC_CTYPE=C,但我没有遇到LANG=en_US.UTF-8的问题,也没有为LC_CTYPE设置任何问题。

相关问题