XML 태그를 찾고 태그 내의 텍스트를 여러 개의 매개변수 값으로 바꿉니다.

XML 태그를 찾고 태그 내의 텍스트를 여러 개의 매개변수 값으로 바꿉니다.

특정 xml 태그를 찾아 태그 내의 텍스트를 매개변수화된 값으로 바꿉니다. 여러 번 발생하면 교체가 필요합니다.

샘플 파일 내용:

<a>abc</a>

현재 시도:

sed -i "s/\(<a>\).*\(<\/a>\)/\(<a>\)$param\(<\/a>\)/g" script.xml

원하는 결과: param=111이면

<a>111</a>

답변1

나는 당신이 해결책을 원한다는 것을 알고 있지만 일반적 으로 매우 간단한 도구를 제외하고 XML 문서를 처리할 때 sedXML 기반 도구(그 중 다수가 있음)를 사용하는 것이 좋습니다 .sed

이것이 내 XML 문서( doc.xml)라고 가정해 보겠습니다.

<?xml version="1.0"?>
<xml>
    <c><a>abc</a></c>
    <b>
        <a>abc</a>
        <a>abc</a>
    </b>
    <a parm="FPM">abc</a>
</xml>

다음 XML 스타일시트를 사용하여 style.xsl문서를 필요한 형식으로 변환하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name = "value" />

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

    <xsl:template match="a/text()[.='abc']">
        <xsl:value-of select = "$value" />
    </xsl:template>

</xsl:stylesheet>

xsltproc대부분의 주요 Linux 배포판에 기본적으로 설치된 도구를 사용하여 변환을 수행합니다 .

$ xsltproc --stringparam value "111" style.xsl doc.xml
<?xml version="1.0"?>
<xml>
    <c><a>111</a></c>
    <b>
        <a>111</a>
        <a>111</a>
    </b>
    <a parm="FPM">111</a>
</xml>
$

답변2

XML 파일을 편집하기 위해 제가 주로 사용하는 도구는 입니다 xmlstarlet. 이것이 제 XML 문서(doc.xml):

<?xml version="1.0"?>
<xml>
    <c><a>abc</a></c>
    <b>
        <a>abc</a>
        <a>abc</a>
    </b>
    <a parm="FPM">abc</a>
</xml>

이것은 xmlstarlet명령입니다:

param=111
xmlstarlet edit --ps --update '//a' --value "$param" doc.xml

산출

<?xml version="1.0"?>
<xml>
    <c><a>111</a></c>
    <b>
        <a>111</a>
        <a>111</a>
    </b>
    <a parm="FPM">111</a>
</xml>

답변3

  1. \(\)귀하의 경우에는 중복됩니다 . 쓰다sed -i "s/<a>.*<\/a>/<a>$param<\/a>/g" script.xml
  2. 문자열에 가 포함된 경우 /다른 구분 기호를 사용하면 더 쉽게 읽을 수 있습니다.sed -i "s_<a>.*</a>_<a>$param</a>_g" script.xml
  3. 이 옵션은 g한 줄에 여러 개의 레이블이 있을 수 있음을 나타냅니다. <a>문제는 다음과 같습니다. next , more 및 last 와 .*일치하므로 다른 태그를 포함하지 마세요.</a><a>sed -i "s_<a>[^<]*</a>_<a>$param</a>_g" script.xml
  4. <a>$param태그에 다른 태그가 중첩되어 있거나 또는 같은 특수 문자가 포함된 경우에는 "이 기능이 작동하지 않습니다 .\

답변4

sedPerl은 탐욕스럽지 않은 일치를 지원하므로 대신 Perl에서 이 작업을 수행하겠습니다 .

perl -i -pe "s|<a>.+?</a>|<a>$param</a>|g" file

.+?이는 "가능한 가장 짧은 문자열과 일치"를 의미하므로 an과 an 사이에서 가장 짧은 문자열을 찾습니다 .<a></a>

그러나 이는 약간 복잡한 XML 문서에서도 실패할 가능성이 높으며 전용 XML 파서 사용을 고려해야 한다는 점을 강조하고 싶습니다.

관련 정보