Как использовать Sed / xmlparser для обновления многострочного текста множеством символов uniode - PullRequest
0 голосов
/ 04 июля 2019

Я работаю с 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>

Мне просто нужно добавить что-то сразу после <enabled>false</enabled>, но нужно убедиться, что ключ включенниже <key>backup-weekly</key> и обновленный контент выглядит так

<?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>

1 Ответ

1 голос
/ 08 июля 2019

Способ сделать это - использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...