我有一个我需要修改的xml文件:
...
</web-app>
我想在此行之前添加一些文字。我尝试过简单的文本并且工作正常(我使用/ bin / ex):
s/<\/web-app/test &/
所以我得到了我想要的东西:
...
test </web-app>
但我需要插入的真实文字是:
<error-page>
<error-code>400</error-code>
<location>/error.html</location>
</error-page>
我该如何处理?我试图创建变量,比如
STR='<error-page>
<error-code>400</error-code>
<location>/error.html</location>
</error-page>'
并使用它
s/<\/web-app/"$STR" &/
但结果不正确。我是否错误地定义了var?是否有可能有多线的变量?我怎么能在之前插入所有这些线?使用sed可以更简单吗?
答案 0 :(得分:2)
有两个问题。一,你的字符串包含'/'字符,所以你应该使用不同的分隔符。二,换行有问题。你可以这样做:
$ STR2=$( echo "$STR" | sed 's/$/\\n/' | tr -d '\n' )
$ sed "s@</web-app@$STR2 &@"
对STR2的分配只是用\n
替换所有换行符,并在bash中工作。在zsh中,发生了一些单词分裂,使得STR2与STR相同。
答案 1 :(得分:2)
你可以尝试
/bin/ex your.xml << EDIT
/<\/web-app>
i
<error-page>
<error-code>400</error-code>
<location>/error.html</location>
</error-page>
.
x
EDIT
答案 2 :(得分:1)
原油但有效:
sed '/<\/web-app>/i<error-page>\n<error-code>400</errorcode>\n<location>/error.html</location>\n</error-page>' filename
答案 3 :(得分:1)
问题是STR
包含ed
将其解释为命令的换行符。我建议将STR
的内容放入文件中,然后使用r
将其读入。例如:
echo -ne '/<\/web-app/-1r OTHER_FILE\nw\n' | ed -s FILE_TO_MODIFY
答案 4 :(得分:0)
这可能对您有用:
STR='<error-page>\
<error-code>400</error-code>\
<location>/error.html</location>\
</error-page>'
echo -e '...\n</web-app>\n...' | sed '/<\/web-app>/i\'"$STR"
...
<error-page>
<error-code>400</error-code>
<location>/error.html</location>
</error-page>
</web-app>
...
要编辑文件:
sed -i '/<\/web-app>/i\'"$STR" file