XMLで1行の一部を見つけてその値を更新するには、Linuxでsedを使用する必要がありますか?

XMLで1行の一部を見つけてその値を更新するには、Linuxでsedを使用する必要がありますか?

sedLinuxを使用してXMLに部分一致がある場合は、XMLの変数値を固定値に更新する必要があります。

例:

入力値:

<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">

要件は、バージョン値に「6.02」がある場合は常にバージョン値を6.02に更新することです。したがって、出力は次のようになります。

<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">

注:tableName="Data"固定値ですがPGPU_IDDBactionversionは異なる場合があります。したがってtablename ="Data"versionisがあるたびに、6.02コマンドsedはバージョンを6.02にのみ変更し、他の値はまったく同じにする必要があります。

答え1

使用xmlstarlet:

xmlstarlet ed -u '//Table/@version[ ../@tableName = "Data" and contains(.,"6.02") ]' -v '6.02' file.xml

versionこれにより、各ノードのすべての属性を見つけることができますTable。その値をTable持つ属性に属するノードを選択します。tableNameData そして部分文字列を含みます6.02。これは文字列でのみ更新されます6.02

結果は標準出力に書き込まれ、ここから新しいファイルにリダイレクトしたり、xmlstarlet ed --inplace -u ...文書を所定の場所で編集するために使用できます(注意して使用)。

答え2

婦人声明:XMLファイルを自動的に変更しない sed 自分がやっていることについて本当に確信がなければ。スクリプト失敗の例を作成するのは簡単です。この場合、 oldversion="..." たとえば、一致します。

sed 's/version="\([^",]*,\)*6.02\(,[^",]*\)*"/version="6.02"/g'

16.02バージョン番号または裏面の交換は不要であるため、6.021スキーマの生成がやや見苦しくなります。[^",]*,カンマまたは二重引用符の後にカンマが含まれていないすべての文字列と一致するため、これらのフィールド\([^",]*,\)*のうち0個以上が一致します。これにより、以前に数字や何もないことを確認できます6.02。バージョン番号の後のフィールドも同様です。

答え3

動作しますかawk

awk '$2~/tableName="Data"/ && $5 ~ /[*",.^]6.02[$.,"*]/ { $5 = "version=\"6.02\">" }1'
  • 入力する
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="B" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="C" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="D" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.06,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="E" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="F" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.09,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="G" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="H" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="I" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.04,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="J" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="K" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="L" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.02,6.03,6.04">
  • 出力
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="A" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="B" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="C" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="D" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.06,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="E" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="F" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.09,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="G" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="H" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="I" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.04,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=1234" DBaction="J" version="6.02">
<Table tableName="Data" primaryKey="PGPU_ID=4284" DBaction="K" version="14.1,20.4,4.30,4.40,5.00,5.30,5.40,5.41,6.00,6.01,6.05,6.03,6.04">
<Table tableName="Data" primaryKey="PGPU_ID=8827" DBaction="L" version="6.02">

関連情報