2012-02-20 116 views
82

我試圖使用sed的 - 未知選項'S'

sed -i -e "s/.*seb.*/ \"$ftp_login_template\"/" $ftp_dir 

但是我得到這個錯誤:

sed: -e expression #1, char 34: unknown option to `s' 

我不明白爲什麼,因爲這完美的作品:

sed -i -e "s/.*wbspassword.*/ \"wbspassword\": \"$password\",/" $user_conf 

任何想法,我做錯了什麼?

難道這是問題嗎? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"

+6

* BSD錯誤信息(包括OSX)是「替換命令中的壞標誌:」 - 將其包括在內以使其更具可讀性。 – tripleee 2015-10-20 08:35:56

回答

201

問題出在斜槓上:你的變量包含它們,最後的命令將會像sed "s/string/path/to/something/g"那樣,包含太多的斜線。

由於sed可以採取任何字符作爲分隔符,你可以嘗試使用另外一個,不會出現在您的替換字符串:

replacement="/my/path" 
sed -e "[email protected]@[email protected]" 

請注意,這不是防彈:如果替換字符串包含後@它會因爲同樣的原因而中斷,並且像\1之類的任何反斜槓序列仍將根據sed規則進行解釋。

+26

只是一個說明,以幫助未來的用戶,因爲我發現這個答案也是有幫助的。原來的海報最有可能在他的替代品中(最可能隱藏在變量中)包含正斜槓。在遇到第一個斜線之後,sed認爲替換已經終止,接下來是選項(例如'g')。 – 2014-02-21 14:05:05

+0

啊,是的,看了10次後,我看到了斜線。那麼我該如何解決這個問題呢? – ppumkin 2014-10-31 22:00:15

+3

很好完成(只記得用'''包裝變量表達式''不'''否則你會在你的最終結果中得到很多'$ content'而不是'$ content'的內容:) :) – 2016-01-08 13:41:30