2014-01-07 24 views
1

我仍然試圖學習sed所以請原諒我,如果這是一個簡單的問題。使用sed我不能得到以下工作

我有一個XML文件,如下

<configs> 
<config name="{subdomain}" protocol="rdp"> 
    <param name="hostname" value="{windows IP}" /> 
    <param name="port" value="3389" /> 
    <param name="username" value="{windows user to log in as}" /> 
    <param name="password" value="{windows password}" /> 
</config> 
</configs> 

我試圖讓添加和移除的配置部分。對於追加我有以下

sed 's/.*[/]configs.*/<config name=\"'$SUBDOMAIN'\" protocol=\"'$TYPE'\">\n<param name="hostname" value=\"$HOSTNAME\">\n<param name="port" value=\"'$PORT'\" >\n<param name="username" value="" >\n<param name="password" value="{windows password}" >\n</config>\n&/' 

這個工作,直到我加入'</config>'線。在那之後,它聲明's'聲明沒有關閉,任何人都可以幫我理解這個語法嗎?

編輯 - 我試圖通過轉義斜槓<\/config>使用下面的建議之一,但我仍然有同樣的問題。

sed 's/.*[/]configs.*/ 
<config name=\"'$SUBDOMAIN'\" protocol=\"'$TYPE'\">\n 
<param name="hostname" value=\"$HOSTNAME\">\n 
<param name="port" value=\"'$PORT'\" >\n 
<param name="username" value="" >\n 
<param name="password" value="{windows password}" >\n 
<\/config>/n&/' guacd/noauth-config.xml 

的sed:-e表達式#1,焦炭17:未結束的'S'命令

這適用於以下

sed 's|.*[/]configs.*|<config name=\"'$SUBDOMAIN'\" protocol=\"'$TYPE'\">\n<param name="hostname" value=\"$HOSTNAME\">\n<param name="port" value=\"'$PORT'\" >\n<param name="username" value="" >\n<param name="password" value="{windows password}" >\n</config>\n&|' guacd/noauth-config.xml 
+0

可能重複「未終止的「命令」故障排除](http://stackoverflow.com/questions/4070478/sed-error-unterminated-s-command-troubleshooting) – tripleee

+2

我不重複這個問題。雖然問題是相關的。我相信這裏的問題僅僅是替代品的''部分中沒有引號的'/'。改爲嘗試'<\/config>'。 –

+1

請記住,'sed'不是編輯XML的好工具。除非您對XML所需的換行符做出假設,否則'sed'代碼會變得非常混亂。最好使用提供正確的XML解析器的語言(Python,Perl等)。 – chepner

回答

0

你已經在你的行話,它關閉了'$SUBDOMAIN'第一個定義腳本的單引號。嘗試從腳本中刪除單引號。

+1

我使用單引號退出並獲取變量。 – user3170001

1

/</config>關閉您的sed。看看這個簡化的例子:

$ date | sed -e 's/./</config>/' 
sed: 1: "s/./</config>/\n": bad flag in substitute command: 'c' 

不起作用。 sed認爲第二個/(在</config>)是該命令的結尾,試圖將以下config作爲標誌(如s///gi中的gi),但沒有c標誌,因此它會窒息。

您可以逃脫/這樣的:

$ date | sed -e 's/./<\/config>/' 
</config>ue Jan 7 19:59:19 CET 2014 

或者使用的,而不是/這樣一個不同的分隔符:

$ date | sed -e 's|.|</config>|' 
</config>ue Jan 7 20:01:30 CET 2014 
[sed的錯誤
+0

感謝您的建議,但使用轉義工作並不如嘗試不同的分隔符,導致相同的錯誤。 – user3170001

+0

'$ SUBDOMAIN','$ PORT'和'$ TYPE'的值究竟是什麼?你能否舉個例子說腳本不行? – janos