그래서 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