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
...その後、以下を使用してノードの属性値の一部を置き換えることができます。exampleno
hello
xmlstarlet
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
追加のソフトウェアをインストールする必要はありません。