嗨,我有一个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
请让我知道如何添加内容。
谢谢 迪内什
答案 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。