특정 xml 태그를 찾아 태그 내의 텍스트를 매개변수화된 값으로 바꿉니다. 여러 번 발생하면 교체가 필요합니다.
샘플 파일 내용:
<a>abc</a>
현재 시도:
sed -i "s/\(<a>\).*\(<\/a>\)/\(<a>\)$param\(<\/a>\)/g" script.xml
원하는 결과: param=111이면
<a>111</a>
답변1
나는 당신이 해결책을 원한다는 것을 알고 있지만 일반적 으로 매우 간단한 도구를 제외하고 XML 문서를 처리할 때 sed
XML 기반 도구(그 중 다수가 있음)를 사용하는 것이 좋습니다 .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
\(\)
귀하의 경우에는 중복됩니다 . 쓰다sed -i "s/<a>.*<\/a>/<a>$param<\/a>/g" script.xml
- 문자열에 가 포함된 경우
/
다른 구분 기호를 사용하면 더 쉽게 읽을 수 있습니다.sed -i "s_<a>.*</a>_<a>$param</a>_g" script.xml
- 이 옵션은
g
한 줄에 여러 개의 레이블이 있을 수 있음을 나타냅니다.<a>
문제는 다음과 같습니다. next , more 및 last 와.*
일치하므로 다른 태그를 포함하지 마세요.</a>
<a>
sed -i "s_<a>[^<]*</a>_<a>$param</a>_g" script.xml
<a>
$param
태그에 다른 태그가 중첩되어 있거나 또는 같은 특수 문자가 포함된 경우에는"
이 기능이 작동하지 않습니다 .\
답변4
sed
Perl은 탐욕스럽지 않은 일치를 지원하므로 대신 Perl에서 이 작업을 수행하겠습니다 .
perl -i -pe "s|<a>.+?</a>|<a>$param</a>|g" file
.+?
이는 "가능한 가장 짧은 문자열과 일치"를 의미하므로 an과 an 사이에서 가장 짧은 문자열을 찾습니다 .<a>
</a>
그러나 이는 약간 복잡한 XML 문서에서도 실패할 가능성이 높으며 전용 XML 파서 사용을 고려해야 한다는 점을 강조하고 싶습니다.