2015-05-21 131 views
0

我有一個像在一個文件中的行,並希望在它下面添加。 我一直試圖用命令Sed命令錯誤

sed -e '/</session-config>/a\<security-constraint>\' -i filename 

但它不工作。的錯誤是:

sed的

:-e表達#1,炭43:無端接`s'的命令

例如inputfile中

<more></more> 
<session-config>20</session-config> 
<otherfields>10</otherfields> 

後sed命令

<more></more> 
<session-config>20</session-config> 
<security-constraint> 
<otherfields>10</otherfields> 

請幫助。

謝謝。

回答

2

您需要轉義</session-config>內的/。否則,它會被視爲正則表達式匹配的結束,s然後在命令開始適用於那些線:

sed -e '/<\/session-config>/a\<security-constraint>\' -i filename 
1

使用不同的分隔符。另外,一些sed在a之後需要一個換行符。這應該工作:

sed -e '\@<session-config>@a\ 
    <security-constraint>\' 
+0

posix版本需要'a'後面的新行,而不是GNU sed版本(但在這種情況下忽略'a'後面的''''a \ n'在附加行上產生'n'而沒有空行之前),但我更喜歡你的版本,無處不在 – NeronLeVelu

0

與另一個分隔符,你不需要反斜槓。
您發現的字符串必須放回去,所以請使用&。
新行上的新字符串:我使用\n。當你的sed不支持它時, 使用真正的新行。 如果您想添加一條線,請不要使用a,而應將其作爲替換字符串的一部分。

sed -e '#</session-config>#&\n<security-constraint>trust_nobody</security-constraint>#' -i filename 
0

爲了清楚起見,simplity,魯棒性,便攜性和軟件的所有其他可取的品質,只用awk:

$ awk '{print} index($0,"</session-config>"){print "<security-constraint>"}' file 
<more></more> 
<session-config>20</session-config> 
<security-constraint> 
<otherfields>10</otherfields> 

注意上面的命令標本兼治您正在搜索的文本和你將要添加的文本作爲字符串,因此不會在乎他們包含什麼字符(當然,字符串終止")。以上將適用於所有操作系統中的所有現代awk。