한 파일에서 다른 파일로 2개의 태그 사이에 XML 콘텐츠 복사

한 파일에서 다른 파일로 2개의 태그 사이에 XML 콘텐츠 복사

2개의 XML 파일이 있습니다.

1.xml

<abc>
....
....
</abc>

<xyz attrib1='1234'>
...
...
</xyz>

2.xml

<abc>
xxx
xxx
</abc>
<xyz attrib2='4321'>
xxx
xxxx
</xyz>

최종 파일을 제공하려면 쉘 스크립트를 사용하여 1.xml 파일의 "xyz" 태그 내용을 2.xml의 내용으로 바꿔야 합니다. 예를 들면 다음과 같습니다.

<abc>
    ....
    ....
    </abc>
    <xyz attrib2='4321'>
    xxx
    xxxx
    </xyz>

답변1

그리고 sed:

sed -n '/<xyz[ >]/,/<\/xyz>/p' 2.xml | \
sed '/<xyz[ >]/,/<\/xyz>/ { /<\/xyz>/! d; r /dev/stdin
    D; }' 1.xml >output.xml

그 뒤에는 개행 문자가 있어야 합니다 /dev/stdin.

sed또 다른 깔끔하지만 덜 효율적인 방법은 다음과 같습니다.

{
    sed '/<xyz[ >]/,$d' 1.xml
    sed -n '/<xyz[ >]/,/<\/xyz>/p' 2.xml
    sed '1,/<\/xyz>/d' 1.xml
} >output.xml

답변2

이를 수행하는 올바른(길기는 하지만) 방법은 범용 텍스트 처리 도구보다는 XML 인식 유틸리티를 사용하는 것입니다.

예를 들어 XSTL 변환을 사용하면xslt 프로세스:

xsltproc - 1.xml <<EOF
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- Identity template (copy input to output) -->
    <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>   
    </xsl:copy>
    </xsl:template>

    <!-- Replace //xyz with its counterpart from 2.xml -->
    <xsl:template match="//xyz">
        <xsl:copy-of select="document('2.xml')//xyz"/>
    </xsl:template>
</xsl:stylesheet>
EOF

이는 텍스트 인코딩, 형식, 엔터티 참조 사용 등에 관계없이 2.xml //xyz을 올바르게 대체합니다.1.xml//xyz

답변3

sed "
    /<xyz/,/<\/xyz>/c\
        $(
            sed -n '
                /<xyz/{
                    :a;
                    N;
                    /<\/xyz>/! ba;
                    s/\n/\\&/gp;
                    }
                ' 2.xml
        )
    " 1.xml

나에게는 쉽게 갈 수 있는 곳이다2.xml( ) c안의 해당 줄을 다음으로 바꾸세요.1.xml 참고: 이 명령은 여러 줄의 입력을 허용할 수 없으므로 줄 사이에 추가 c해야 합니다 .\

답변4

perl -0777ne '                                # slurp xmls
   $tag2 or ($tag2) = /(<xyz.*<\/xyz>)/s;     # grab tag <xyz> from 2.xml
   @ARGV or print s|<xyz.+?</xyz>|$tag2|srg;  # replace tag <xyz> in 1.xml globally
' 2.xml 1.xml

관련 정보