sed コマンドを使用した XML ファイルの特定のタグ値の検索と置換

sed コマンドを使用した XML ファイルの特定のタグ値の検索と置換

Bashシェルスクリプトを介してXMLファイルを操作する必要がある作業があります。

次のように進んでください。

  • XMLファイルの値を照会します。
  • 他の要素の値を新しい値に置き換えます。

以下はサンプルXMLです。

<context-param>
    <param-name>com.sun.faces.sendPoweredByHeader</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>25</param-value>
  </context-param>
  <context-param>
    <param-name>testing</param-name>
    <param-value>25</param-value>
  </context-param>

parm値を更新するには、シェルスクリプトを使用する必要があります<param-value>25</param-value><param-value>3</param-value>

パラメータname()のパラメータ値のみを更新するSEDコマンドは何ですか<param-name>com.sun.faces.numberOfViewsInSession</param-name>

次のコマンドを試してみました。

sed -i 's/<param-value>25<\/param-value>/<param-value>3<\/param-value>/' test.xml

ただし、このコマンドはすべてのパラメーター値を更新します。 com.sun.faces.numberOfViewsInSessionを更新するだけです。

答え1

XMLStarletを使用し、ドキュメントにルートノードがあるとします。

xmlstarlet ed \
    -u '//context-param[param-name = "com.sun.faces.numberOfViewsInSession"]/param-value[. = 25]' \
    -v 3 file.xml

これにより、正しいparam-valueノード(値が25のノード([. = 25]以前の値が重要でない場合はビットを削除)と子値が25のノードの子context-param)が選択され、その値が3に変更されます。param-namecom.sun.faces.numberOfViewsInSession

生成された文書は次のとおりです(root偽ノードの挿入)。

<?xml version="1.0"?>
<root>
  <context-param>
    <param-name>com.sun.faces.sendPoweredByHeader</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>3</param-value>
  </context-param>
  <context-param>
    <param-name>testing</param-name>
    <param-value>25</param-value>
  </context-param>
</root>

答え2

sed -i 's#<param-value>25</param-value>#<param-value>3</param-value>#' test.xml

答え3

次のsedコマンドを使用すると、特定のタグ値を更新できます。

sed -i '/<param-name>com.sun.faces.numberOfViewsInSession<\/param-name>/{n;s/<param-value>3<\/param-value>/<param-value>25<\/param-value>/}' test.xml

関連情報