1つのサブノードでのみxmlstarletを使用してXMLを編集する

1つのサブノードでのみxmlstarletを使用してXMLを編集する

コマンドを使用する場合:

-bash-4.2$ xmlstarlet ed -u "/configurations/rules/rule/branch" -v 'DAVID' config.xml > final.xml

出力ファイルが次に変更されたことを確認しました。デビッドただし、「branch」タグが宣言されているすべての場所でグローバル変更が行われます。

しかし、1つのサブノード(「APP1」など)でのみ変更したいと思います。どのコマンドを使用する必要がありますか? 「DAVID」値をパラメータとして渡す方法はありますか?

  <configurations>
    <smtpHost>smtp3.gmail.com</smtpHost>
    <smtpPort>25</smtpPort>
    <emailFrom>[email protected]</emailFrom>
    <emailSubject>Push notification</emailSubject>
    <!-- Stash general URL-->
    <gitViewerURL>http://mydtbld0005.gmail.com:7990/projects/</gitViewerURL>

    <!-- repositories list and commit URL path per repo -->

    <repositoryViewerPath name="hookTester" path="DevOps/repos/hooktester/commits/"/>

    <separator>#@#</separator>
    <catExe>cat</catExe>
    <catExeWindows>type</catExeWindows>
    <gitExe>git</gitExe>
    <gitExeWindows>C:\\Program Files (x86)\\Git\\cmd\\git.exe</gitExeWindows>
    <gitFolder>/gitdata/alm_mng.git</gitFolder>
    <gitFolderWindows>c:\gitdata\alm_mng.git</gitFolderWindows>
      <rules>
            <rule>
                <name>APP1</name>
                <repo>hookTester</repo>
                <branch>refs/heads/master</branch>
                <emailTo>[email protected]</emailTo>
                <path>F1/ido.xml </path>
            </rule>
            <rule>
                <name>APP2</name>
                <repo>hookTester</repo>
                <branch>refs/heads/master</branch>
                <emailTo>[email protected]</emailTo>
                <path>F2/ido.xml </path>
            </rule>
       </rules>
  </configurations> 

ベストアンサー1

xmlstarlet解決策:

new_branch="DAVID"
xmlstarlet ed -u "/configurations/rules/rule[name='APP1']/branch" -v "$new_branch" config.xml > final.xml

キーノード<rule>は次のようにする必要があります。

<rule>
      <name>APP1</name>
      <repo>hookTester</repo>
      <branch>DAVID</branch>
      <emailTo>[email protected]</emailTo>
      <path>F1/ido.xml </path>
    </rule>

初期ファイルを変更することもできます。所定の位置にグローバルオプションを適用すると、次のようになります-L

xmlstarlet ed -L -u ... config.xml

おすすめ記事