0

XML ファイルに含まれるデータを grep する必要があります。取得する必要がある要素は複数あり、最後の要素はノード内にあります。私が調べている要素の間にはたくさんのデータがあります。次のように、複数の要素を簡単にgrepできます。

grep -E "<first|<second|<third|<seventh" file.xml

しかし、私は次のようなファイル構造を持っているので:

<first>First</first>
<second>Second</second>
<third>Third</third>
<fourth>Fourth</fourth>
<fifth>Fifth</fifth>
<sixth flexible="true">
    <low>0.09</low>
    <high>5.90</high>
</sixth>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>

ノード内の数値データを取得して<seventh>いません (そのコマンドでは期待していませんでした)。したがって、(after) スイッチを使用しようとしていますgrep -An。ここで、「n」は最初の一致後に一致する行数で、7 番目のノードの残りを取得します。

grep -E "<first" -E "<second" -E "<third" -E -A3 "<seventh" file.xml

どちらが返されますか:

<first>First</first>
<second>Second</second>
<third>Third</third>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>

これをマッサージして最終結果を得ることができます (実際には、関連する 1、2、3 番目の文字列と共に 7 番目のノードからの「高」データのみが必要です)。しかし、それはうまくいきません。直後に最初の 3 つの要素を取得して<firstいて、残りのコマンドは無視されます。

私も試しました:

grep -E "<first|<second|<third" -E -A3 "<seventh" file.xml

これにより、同様の結果が得られますが-E -A3 "<seventh、コマンドの " " 部分は完全に無視されます。-A3 はまだコマンドの前の部分に逆方向に適用されているため、無視しないと思います。ポストコマンド スイッチを使用できることは理解していますが、どれだけ戻るかを制御できますか?

grep のマニュアル ページを読みましたが、コマンドを連結する方法がわかりませんでした。それが重要な場合は Mac を使用していますが、必要に応じて Linux と Windows のボックスに簡単にアクセスできます。

必要なデータを取得するにはどうすればよいですか?

4

2 に答える 2

1

まず、man grepもう一度目を通してみて、複数-Eは不要であり、複数のパターンは で想定されていないことを確認してくださいgrep

第 2 に、コンテキストが必要であることがわかっている場合は、次のseventh2 つのコマンドを使用します。

$ grep -E '<first|<second|<third' file.xml; grep -A3 '<seventh' file.xml
<first>First</first>
<second>Second</second>
<third>Third</third>
<seventh flexible="false">
    <low>1.82</low>
    <high>3.14</high>
</seventh>

実際にそれがわからない場合は、xpathまたは別の xml 解析ツールを使用することをお勧めします。

この質問も参照してください。

于 2012-07-11T23:38:08.093 に答える
0

XML の検索に正規表現を使用しないでください。彼らは仕事のために設計されていません。あなたのコードは間違っています。たとえば、@Levitsky によって指定されたコードは、特定の文字列がコメントまたは CDATA セクション内にある場合、または入力に という要素が含まれている<firstly>場合、または改行の配置が異なる場合に失敗します。(99% の時間しか動作しないという意味で、コードが間違っていても問題にならない場合もありますが、それが要件である場合は、そう言うことを期待します。)

XML を検索するには、XPath を使用するか、より複雑な検索を行うには XQuery を使用します。

要件に対する XPath ソリューションは非常に単純です。指定した XML がwrapper要素内にあると仮定すると、XPath 2.0 式はwrapper/(first, second, third, seventh). したがって、このタスクの XPath は信頼性が高いだけでなく、はるかに簡単です。

于 2012-07-12T07:23:51.770 に答える