2013-05-27 82 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.我不希望打印文件,只是更新。 –