XMLファイルで文字列を置き換える方法は?

XMLファイルで文字列を置き換える方法は?

XMLファイルの文字列を置き換えようとしています。

~から

<hello="value" exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,aa=bb ccc,dd=eeee,ff=gggg,hh=iii,jj=kkk,ll=mmmm" />

私はただ変えたい

aa=bb ccc,dd=eeee

そして

xx=yy yyy,zz=aaaa,bb=cc ddd

この目標を達成する方法は?ありがとう

答え1

XMLがうまく構成されており、次のように仮定します。

<?xml version="1.0"?>
<root>
  <hello exmapleno="Other attribute's value"/>
  <hello exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,aa=bb ccc,dd=eeee,ff=gggg,hh=iii,jj=kkk,ll=mmmm"/>
</root>

aa=bb ccc,dd=eeee...その後、以下を使用してノードの属性値の一部を置き換えることができます。examplenohelloxmlstarlet

xmlstarlet edit \
    --var searchstring '"aa=bb ccc,dd=eeee"' \
    --var replacement  '"xx=yy yyy,zz=aaaa,bb=cc ddd"'  \
    --update '//hello/@exampleno[contains(.,$searchstring)]' \
    --expr 'concat(
        substring-before(.,$searchstring),
        $replacement,
        substring-after(.,$searchstring)
    )' file.xml

--var変数はXpath式なので、文字列にはリテラル二重引用符を含める必要があります。)

または、XPath式に素晴らしい変数がない場合は、次のようにします。

xmlstarlet edit \
    --update '//hello/@exampleno[contains(.,"aa=bb ccc,dd=eeee")]' \
    --expr 'concat(
        substring-before(.,"aa=bb ccc,dd=eeee"),
        "xx=yy yyy,zz=aaaa,bb=cc ddd",
        substring-after(.,"aa=bb ccc,dd=eeee")
    )' file.xml

これで修正されますみんな hello文書には、exampleno検索文字列を持つ属性を持つノードが含まれています。これらのノードの1つを手動で選択し、thanを使用しますか//hello

このコマンドの目的は、XPath式//node/@exampleno(つまり、examplenoすべてのhelloノードの属性)に一致するすべてのノードを見つけることです。追加の条件は、値に検索文字列を含める必要があることです。次に、式に基づいて一致する属性の値を更新します--expr。この式は、ターゲット文字列(最初の出現)の前後にある属性値の部分を選択し、それらの間の新しい文字列に関連付けます。

出力は端末に書き込まれますが、適切な名前のoptionsを使用してその場で編集されます--inplace

短縮されたオプション名を使用してテストを実行する:

$ xmlstarlet ed --var s '"aa=bb ccc,dd=eeee"' --var r '"xx=yy yyy,zz=aaaa,bb=cc ddd"' -u '//hello/@exampleno[contains(.,$s)]' -x 'concat(substring-before(.,$s),$r,substring-after(.,$s))' file.xml
<?xml version="1.0"?>
<root>
  <hello exmapleno="Other attribute's value"/>
  <hello exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,xx=yy yyy,zz=aaaa,bb=cc ddd,ff=gggg,hh=iii,jj=kkk,ll=mmmm"/>
</root>

答え2

私はxmlstarletあなたが要求した後にインストールしたくないと仮定します。ここでも同じ問題が発生しますUnixコマンドだけが必要だと述べました。

最初:
同じ質問を2回しないでください!
別の方法でこれを行うには、コメントを使用してください。

追加のソフトウェアをインストールしたくないので、「unixコマンド」に言及したとします。

今日、ほとんどのUNIXベースのオペレーティングシステムには既定のインストールにPerlが含まれているため、次のことができます。

perl -pne 's/aa=bb ccc,dd=eeee/xx=yy yyy,zz=aaaa,bb=cc ddd/' < file.xml > file2.xml

追加のソフトウェアをインストールする必要はありません。

関連情報