考虑到我具有以下xml内容:
将找到模式[say patternString]:
</secure-deployment>
<% end %>
希望在匹配上述模式后添加以下xml内容:
要附加的样式* [例如appendingString]:
<secure-deployment name="gvh-vid.war">
<resource>gvh-vid</resource>
</secure-deployment>
输出应采用以下格式:
</secure-deployment>
<% end %>
<secure-deployment name="gvh-vid.war">
<resource>gvh-vid</resource>
</secure-deployment>
尝试使用以下语法的awk命令,并且确实在匹配模式[say patternString]的每一行之后附加[say appendingString],而不是在经过Macthed模式之后附加内容:
即
awk '/<\/secure-deployment>/,/<% end %>/ {$0=$0"\n <secure-deployment name=\"gvh-wid.war\">\n <resource>gvh-vid<\/resource>\n <\/secure-deployment>"} 1' standalone.xml.erb
观察到的输出:
</secure-deployment>
<secure-deployment name="gvh-vid.war">
<resource>gvh-vid</resource>
</secure-deployment>
<% end %>
<secure-deployment name="gvh-vid.war">
<resource>gvh-vid</resource>
</secure-deployment>
有人可以建议我使用awk命令对此进行改进吗?
答案 0 :(得分:1)
我不清楚awk
,但我认为问题在于您如何进行比赛:使用
/</secure-deployment>/,/<% end %>/
您正在制作OR
,但如果我正确理解了您的问题,您想要的是AND
。
因此,我将您的选择替换为:
/</secure-deployment>\s*<% end %>/
期望这两个标签是连续的,只能用任意数量的空格(包括换行符)分隔。
更新: 我只是发现我提出的答案不起作用,并在评论中解释了原因。
所以最后的答案是:如果不引入真正的骇客技巧,您将无法改善awk脚本以在用例中工作,因为awk旨在一次处理一行输入 >。
我尝试为您编写一个perl
脚本来完成相同的工作:
perl -0777p -i -e 's/^(.*?)(\s*<\/secure-deployment>\s*<% end %>)(.*?)$/\1\2\n <secure-deployment name=\"gvh-wid.war\">\n <resource>gvh-vid<\/resource>\n <\/secure-deployment>\3/s' standalone.xml.erb
我授予您这不是有史以来最清晰的脚本,但是它应该可以工作...