2013-05-27 55 views
27

我正在尝试通过OS X Terminal使用SED来执行查找和替换。如何使用SED在目标字符串中使用“/”字符查找和替换URL字符串?

想象我有这个字符串在整个文本文件散落:http://www.find.com/page

而且我想这个字符串替换:http://www.replace.com/page

我有麻烦了,因为我不知道如何正确逃生或者在我的字符串中使用“/”字符。例如,如果我只是想找到“猫”与“狗”代替我发现下面的命令完美的作品:

sed -i '' 's/cat/dog/g' file.txt 

有没有人对如何实现相同的功能的任何想法而不是只猫和狗有字符串或URL容器的“/”字符?我尝试了很多不同的方式来转义“/”字符,但似乎SED不能再“查找”字符串,并且它不执行任何发现替换操作。

任何帮助或提示,非常感谢。

谢谢!

回答

73

/不是sed命令的分隔符,它只是其中一个可能的命令。对于这个例子,你可以例如使用,,因为它不会与你的字符串冲突;

echo 'I think http://www.find.com/page is my favorite' | 
    sed 's,http://www.find.com/page,http://www.replace.com/page,g' 
+0

Sed支持自定义分隔符的功能使事情变得更简单。谢谢@Joachim! –

22

sed可以采取“s”后面的任何内容作为分隔符。由于您正在使用URL,因此在使用/以外的其他分隔符时,如果您的替换结束和替换开始时不会混淆sed,这是一种很好的做法。

但是,如果您愿意,也可以使用/。你只需要逃避字面/

所以,你可以这样做:

sed 's/http:\/\/www.find.com\/page/http:\/\/www.replace.com\/page/g' input_file 

或使用不同的分隔符,以避免使你的神秘的sed更加神秘。

sed 's#http://www.find.com/page#http://www.replace.com/page#g' input_file 
+0

我喜欢不同的分隔思想 –

+0

使用这种方法,为什么以下只输出没有任何改变的文件? 'sed's#:0.0.1#:new-build-number#g'some.yaml'。 1.更改不会发生。 2.我不希望打印文件,只是更新。 –