sed将字符串附加到xml文件中

时间:2019-01-24 12:48:44

标签: xml sed append

嗨,我有一个xml文件。看到标签后,我想添加以下标签。例如

我要添加

<Context 
allowLinking="false"
privileged="false"
useHttpOnly="true"
xmlValidation="false">
</Context>

文件看起来像这样

<Context>
</Context>

添加后应该是这样

<Context allowLinking="false"
privileged="false"
useHttpOnly="true"
xmlValidation="false">
</Context>

我使用了以下sed命令,但无法如上所示在标签内添加参数

我尝试了以下sed

grep 'allowLinking' /bao/tomcat/conf/context.xml
if [ $? -ne 0 ]
then    
    sed -i '/<Context .*?>/i allowLinking="false" \n privileged="false" \n useHttpOnly="true" \n xmlValidation="false"/' /tmp/context.xml
fi

请让我知道如何添加内容。

谢谢 迪内什

1 个答案:

答案 0 :(得分:-1)

您可能想尝试:

sed -i 's/<Context *>/<Content allowLinking="false" \n privileged="false" \n useHttpOnly="true" \n xmlValidation="false">/' /tmp/context.xml

这使用s命令而不是您的i命令,并且仅用space.*?替换了搜索中的space*

如果您想替换现有属性,.*?可能会很有用,但是只有在它们全部位于同一行时,它才能在这里工作,并且在任何情况下您都需要类似[^>]*以避免吞下结束语>

最后,一种更简洁,更通用的书写方式是使用shell变量(已通过bash测试):

ATTRIB='allowLinking="false" \n privileged="false" \n useHttpOnly="true" \n xmlValidation="false"'
TAG='Context'
sed -i "s/<${TAG} *>/<${TAG} ${ATTRIB}>/" /tmp/context.xml

警告:正如迈克尔·凯(Michael Kay)在评论中指出的那样:

  

[此]之所以起作用,是因为您很幸运:数据中没有像&符这样的特殊字符。

对于Linux sed,需要警惕的特殊字符是[\^$.*&-]之后的[sed -E添加?+|{}(),请参阅here。其他sed可能包含更多内容。

同样,如所写,该示例不能包含单引号'或正斜杠/,除非它们被反斜杠\所转义。注意\n用于引入换行符;在这里可以使用反斜杠。

最后,正如Micheal Kay指出的那样,这不是sed的工作,而是XSLT的工作。当然,每个人都需要意识到2009年的这个著名答案:RegEx match open tags except XHTML self-contained tags