【问题标题】:How to use Sed/xmlparser to update multi line with many uniode characters如何使用 Sed/xml 解析器更新具有许多 unicode 字符的多行
【发布时间】:2019-11-14 17:12:16
【问题描述】:

我正在使用 sed 在特定模式匹配后添加新数据。 在这种情况下,我可以将 sed 用于单行并在使用多行表达式时接收异常。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config xmlns="http://artifactory.jfrog.org/xsd/2.1.7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jfrog.org/xsd/artifactory-v2_1_7.xsd">
    <backups>
        <backup>
            <key>backup-weekly</key>
            <enabled>false</enabled>
            <cronExp>0 0 2 ? * SAT</cronExp>
            <retentionPeriodHours>336</retentionPeriodHours>
            <createArchive>false</createArchive>
            <excludedRepositories/>
        </backup>
    <backups>
</config>

我只需要在&lt;enabled&gt;false&lt;/enabled&gt; 之后添加一些东西,但需要验证启用的密钥应该低于&lt;key&gt;backup-weekly&lt;/key&gt; 并且更新的内容看起来像这样

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config xmlns="http://artifactory.jfrog.org/xsd/2.1.7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jfrog.org/xsd/artifactory-v2_1_7.xsd">
    <backups>
        <backup>
            <key>backup-weekly</key>
            <enabled>false</enabled>
            <dir>/opt/jfrog/data/backup</dir>
            <cronExp>0 0 2 ? * SAT</cronExp>
            <retentionPeriodHours>336</retentionPeriodHours>
            <createArchive>false</createArchive>
            <excludedRepositories/>
        </backup>
    <backups>
</config>

【问题讨论】:

    标签: xml bash sed


    【解决方案1】:

    一种方法是使用 XSLT。例如,将其另存为 yourfile.xsl:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns="http://artifactory.jfrog.org/xsd/2.1.7">
        <xsl:output indent="yes" method="xml" encoding="utf-8" />
        <xsl:strip-space elements="*"/>
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="//*[name()='backup'][./*[name()='key']='backup-weekly']/*[name()='enabled'][.='false']">
            <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
            <dir>/opt/jfrog/data/backup</dir>
        </xsl:template>
    </xsl:stylesheet>
    

    并在此命令行中使用 xsltproc:

    xsltproc yourfile.xsl yourfile.xml
    

    【讨论】:

    • XMLStarlet(而不是xsltproc)也可用于使用以下命令执行转换:xml tr yourfile.xsl yourfile.xml &gt; newfile.xml。注意:您需要确保您的来源.xml 格式正确。目前,OP 的给定示例缺少关闭 &lt;/backups&gt; 标记。
    • @RobC:这可能是一个错字:当他缩短文件以将其发布到这里时,他可能已经复制/粘贴了开头并手动重写了结尾。
    • ...可能是的,或者可能没有使用 XML 感知编辑工具来指示此类错误。我想我还是会提到它,因为我注意到你的答案没有被接受;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2018-02-28
    • 2015-01-19
    相关资源
    最近更新 更多