awk 또는 sed를 사용하여 XML 태그 값 변경

awk 또는 sed를 사용하여 XML 태그 값 변경

그래서 XML 파일이 있습니다

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>platform</artifactId>
        <groupId>com.test.aem</groupId>
        <version>6.1.1-SNAPSHOT</version>
    </parent>

version값을 새 값으로 업데이트하고 싶습니다.

        <version>6.5.0-SNAPSHOT</version>

<parent>하지만 이 섹션에서만 업데이트 되고 파일의 다른 곳에서는 업데이트되지 않도록 하고 싶습니다 . 배쉬를 사용할 수 있나요?

xmlstarlet아쉽게도 용기에 포함되어 있지 않아서 사용할 수 없습니다 .

답변1

XML 조각의 형식이 잘못되었다는 사실( </project>후행 요소의 끝을 놓쳤음)을 제외하고 올바른 대답은 XML 구문 분석기를 사용하여 XML을 구문 분석하고 편집해야 한다는 것입니다.

xmlstarlet edit --update '/_:project/_:parent/_:version' --value '6.5.0-SNAPSHOT' pom.xml

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>platform</artifactId>
    <groupId>com.test.aem</groupId>
    <version>6.5.0-SNAPSHOT</version>
  </parent>
</project>

_:별도의 네임스페이스( )에 있으므로 각 요소 이름의 접두사는 필수 와일드카드입니다 xmlns=....

물론 출력을 임시 파일에 쓴 다음 원본 파일을 결과로 바꿀 수 있습니다. 또는 xmlstarlet edit --inplace편집한 내용이 유효하다고 확신하는 경우 이 방법을 사용할 수 있습니다.

답변2

xmlstarlet 유틸리티가 존재하지 않는 경우 탐색할 수 있는 또 다른 옵션은 Python입니다.

우리는 이 etree모듈을 사용하여 XML 계층 구조를 탐색하고 버전을 수정합니다.

python3 -c 'import sys, xml.etree.ElementTree as ET

#> unpack command line arguments
new_ver,xml_file = sys.argv[1:]

#> 
tree = ET.parse(xml_file)
root = tree.getroot()

#> traverse,selec, & modify the desired
#> node using XPath expressions
for e in root.findall("./parent/version"):
  e.text = new_ver

# save changes
tree.write(xml_file)
' "6.5.0-SNAPSHOT" input.xml

관련 정보