尝试使用shell脚本修改文件 - 使用/ bin / ex

时间:2012-06-27 17:32:08

标签: bash shell sed ex

我有一个我需要修改的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可以更简单吗?

5 个答案:

答案 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