gpt4 book ai didi

linux - 通过shell脚本替换节点

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:23 25 4
gpt4 key购买 nike

我的代码库中有以下 xml 片段:

    <property name="myData">
<map>
<entry key="/mycompany/abc">
<value>Mike</value>
</entry>
<entry key="/mycompany/pqr">
<value>John</value>
</entry>
<entry key="/mycompany/xyz">
<value>Sara</value>
</entry>
</map>
</property>

上面的代码片段只是 XML 文件的一部分。我有一个现有的 shell 脚本,它替换了上述文件中的一些数据。

现在,我需要修改现有的 shell 脚本来注释该部分,如下所示:

            <!-- entry key="/mycompany/abc">
<value>Mike</value>
</entry>
<entry key="/mycompany/pqr">
<value>John</value>
</entry -->

是否可以通过shell脚本对上述2个条目进行注释?我可以替换任何出现的 with,因为我只有一个这样的唯一出现,但我无法替换 结束标记 if/mycompany/pqr 节点,因为如果我尝试将其替换为

,则所有出现都会被替换

知道如何在 shell 脚本中替换这个结束节点吗?

谢谢!

最佳答案

使用这样的 xslt 样式表:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output omit-xml-declaration="no"/>

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/property/map/entry[@key='/mycompany/abc']"/>
<xsl:template match="/property/map/entry[@key='/mycompany/pqr']"/>
</xsl:stylesheet>

然后通过 shell 脚本使用 xsltproc xsl 处理器:

$ xsltproc fix.xslt document.xml

这会给你:

<?xml version="1.0"?>
<property name="myData">
<map>


<entry key="/mycompany/xyz">
<value>Sara</value>
</entry>
</map>
</property>

如果您确实需要注释掉这些节点,那么我的 xslt-foo 不够强大 - 您可能需要 <xsl:comment> .

编辑:awk 的解决方案:

awk '/<entry key="\/mycompany\/(abc|pqr)">/,/<\/entry>/ {p=1}; /.*/{ if(p==0) {print;}; p=0 }' blah.xml

结果:

<property name="myData">
<map>
<entry key="/mycompany/xyz">
<value>Sara</value>
</entry>
</map>
</property>

请注意,awk 版本无法与嵌套标签一起正常工作。

-尼克

关于linux - 通过shell脚本替换节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com