2013-08-20 58 views
0

我試圖做一個查找/替換和插入與sed,但我不斷收到一條消息,說:「在n命令結束時的額外字符。」我也沒有從終端上運行它,它嵌入在shell腳本中,所以我可以將它發送給其他人。在包含註冊表達式的字符串上使用sed

這就是我試圖運行

sed -i 's/include "/var/run/racoon/*.conf" ;/# include "/var/run/racoon/*.conf" ;/g' ~/Documents/test.conf; 
sed '$a; include "/etc/racoon/remote/*.conf" ;/g' ~/Documents/test.conf; 

爲了使其更容易看到的,我試圖取代

include "/var/run/racoon/*.conf" ; 

# include "/var/run/racoon/*.conf" ; 

,然後加這個

include "/etc/racoon/remote/*.conf" ; 

基本上,我只想註釋掉文件的最後一行,然後在它後面插入一行。我對sed很新,所以我不確定如果我對這一切都有錯,任何幫助將不勝感激!

回答

1

萬一有任何人遇到這個問題,你要麼下載gnu-sed,要麼以其他方式做。

如果您安裝了Homebrew,可以輕鬆下載gnu-sed。

brew install gnu-sed 

或者你也可以像我一樣

做替換

sudo perl -pi -e 's|include "/var/run/racoon/\*.conf" ;|# include "/var/run/racoon/*.conf" ;|g' /etc/racoon/racoon.conf; 

添加一行用perl和printf。對我來說,它始終是139行,所以我可以走這條路。

line='include "/etc/racoon/remote/*.conf" ;' 
sudo printf '%s\n' H 139i "$line" . wq | ed -s /etc/racoon/racoon.conf 

謝謝devnull幫助我獲得正確的語法。

1

至少有2個問題與你想什麼:

  • 您需要使用不同的分隔符,因爲你的模式和替代含有/。您可以使用|
  • 該模式中的*需要轉義,\*

這樣,第一個表達式將如下所示:

sed -i 's|include "/var/run/racoon/\*.conf" ;|# include "/var/run/racoon/*.conf" ;|g' ~/Documents/test.conf; 

類似地,改變第二個。

+0

謝謝,我實際上已經嘗試過,但它不適合我。結果我真正的問題是我沒有安裝gnu sed,這是什麼允許-i選項。 – nickg

相關問題