如何使用bash命令在xml中的匹配模式后附加新标签

时间:2018-08-07 19:39:41

标签: bash shell

考虑到我具有以下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命令对此进行改进吗?

1 个答案:

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

我授予您这不是有史以来最清晰的脚本,但是它应该可以工作...