0

次の構造を持つ、非常に大きな (10 GB) xml ファイルはほとんどありません。ご覧のとおり、ファイルには一連のレコードが含まれています。私がやりたいのは、1 つまたは複数のプロパティに基づいてレコードを検索することです。問題は、単純な grep でプロパティを含む行が表示されることです。たとえば、grep を実行すると、100 行目、300 行目などのようになります。しかし、一致した行だけでなく、関連するレコード要素を抽出する機能が必要です。役立つ UNIX ユーティリティはありますか?

<records>
 <record seq="1">
  <properties>
   <property name="AssetId">1234</property>
  </properties>
 <message>messsage1</message>
</record>
<record seq="2">
 <properties>
  <property name="VI-ID">4567</property>
 </properties>
 <message>message2</message>
</record>
<records>
4

3 に答える 3

4

xmlstarletシェル スクリプトから XPath を実行できます。これは完璧な使用例です。

例えば:

xmlstarlet sel -t \
  -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
  -c .

AssetId プロパティが 1234 のレコード全体を出力します。

1 回のパスで複数のマッチを行いたい場合、これもサポートされています。

xmlstarlet sel \
  -t -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
     -c . -n -n \
  -t -m '//record[properties/property/@name="VI-ID"]' \
     -c . -n -n \
  <input.xml

...このバージョンは、AssetID が 1234 のレコード、または任意のVI-ID値を持つ現在のレコードのいずれかを出力し、発行された各レコードの後に​​ 2 つの改行を挿入します。

于 2012-05-03T22:13:12.710 に答える
0

基本的な UNIX ツールのみを使用したい場合は、1 行または複数行にまたがるプロパティを抽出できる (ばかげた) 小さな sed スクリプトを次に示します。

sed -n '
/<open>[^<]*<\/open>/ {
  p
  b
}

/<open>/,/<\/open>/ {
  p
}' file.xml

サンプル入力:

<open>stuff</open>
<otherTag>
otherstuff
</otherTag>
<open>
morestuff
</open>
<otherTag>astlkj</otherTag>

出力例:

<open>stuff</open>
<open>
morestuff
</open>

本番環境での使用には適していません。タグに複数の属性がある場合、この方法はすぐに困難で面倒になり、xml が非常に複雑な場合は不可能になります。しかし、あちこちの情報を解析するために行うべきです。

于 2012-05-03T22:21:07.740 に答える
0

おそらく最も簡単な方法は、-Cオプション toを使用することgrepです。各一致の周りに指定された行数を出力します。はい、レコードの境界で正確に停止するわけではありませんが、通常は含まれていることを保証するだけで十分です。

于 2012-05-03T22:06:32.560 に答える