2013-10-18 47 views
102

被迫爲當前客戶端使用CVS,並且遠程回購的地址已更改。我可以找到更改我的本地代碼中的遠程地址的唯一方法是遞歸搜索和替換。無效的命令代碼,儘管有轉義週期,但使用sed

然而,sed命令我期望的工作:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

我得到一個錯誤的每個文件:

sed: 1: ".//file/path ...": invalid command code .

我試圖逃脫在sed比賽/替換期間,但不解決任何問題。

回答

249

如果您是在OS X,這可能與sed命令無關。在OSX版本sed上,-i選項需要extension參數,因此您的命令實際上被解析爲extension參數,並且文件路徑被解釋爲命令代碼。

嘗試明確加入-e論證,並給予''作爲參數傳遞給-i

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \; 

this

+1

但是,您給出的示例命令給出了:sed:RE錯誤:非法字節序列 – helion3

+0

這很可能是複製粘貼編碼問題,因爲它在我的測試中沒有問題。請參閱[這](http://stackoverflow.com/questions/11287564/getting-sed-error-illegal-byte-sequence-in-bash) – damienfrancois

+14

如果你花了10分鐘,就像我發現差異,它是-e選項 – acheron55

0

可能是您的新域名包含/?如果是,請嘗試使用sed中的/以外的分隔符,例如#,

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \; 

這也將是很好的用單引號s///,而不是雙引號,以避免變量替換或任何其他意外的行爲

26

你只是忘了提供一個參數到-i。只需將-i更改爲-i ''即可。

當然,這意味着你不希望你的文件被備份;否則提供您選擇的延伸,如-i .bak