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ユーティリティが存在しない場合にナビゲートできるもう1つのオプションは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

関連情報