1

我有一个需要修改的 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 ?多线可以有这样的var吗?我怎样才能在之前插入所有这些行?用sed可以做得更简单吗?

4

5 回答 5

2

有两个问题。一,您的字符串包含“/”字符,因此您应该使用不同的分隔符。二,换行是有问题的。你可以这样做:

 $ STR2=$( echo "$STR" | sed 's/$/\\n/' | tr -d '\n' )
 $ sed "s@</web-app@$STR2 &@" 

对 STR2 的赋值只是将所有换行符替换为\n, 并在 bash 中工作。在 zsh 中,发生了一些分词,使 STR2 与 STR 相同。

于 2012-06-27T18:17:18.580 回答
2

你可以试试

/bin/ex your.xml << EDIT
/<\/web-app>
i
<error-page>
<error-code>400</error-code>
<location>/error.html</location>
</error-page>
.
x
EDIT
于 2012-06-27T18:25:11.277 回答
1

问题在于它STR包含ed将其解释为命令的换行符。我建议将 的内容STR放入文件中并用于r读取它。例如:

echo -ne '/<\/web-app/-1r OTHER_FILE\nw\n' | ed -s FILE_TO_MODIFY
于 2012-06-27T18:38:11.820 回答
1

粗鲁但有效:

sed '/<\/web-app>/i<error-page>\n<error-code>400</errorcode>\n<location>/error.html</location>\n</error-page>' filename
于 2012-06-27T17:57:59.923 回答
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
于 2012-06-28T05:12:22.697 回答