2015-05-21 132 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。