0

次の形式のxmlファイルがあります

<starttag name="AAA" >
    <innertag name="XXX" value="XXX"/>
    <innertag name="XXX" value="XXX"/>
    <innertag name="XXX" value="YYY"/>
</starttag>
<starttag name="BBB" >
    <innertag name="XXX" value="XXX"/>
    <innertag name="XXX" value="XXX"/>
    <innertag name="XXX" value="XXX"/>
</starttag>
<starttag name="CCC" >
    <innertag name="XXX" value="XXX"/>
    <innertag name="XXX" value="XXX"/>
    <innertag name="XXX" value="YYY"/>
</starttag>
..
..
..

内部タグのいずれかの値が YYY である starttag の名前属性をすべて抽出したいと考えています。

したがって、上記のファイルでは、出力は AAA と CCC になります。正規表現一致のみを使用できます。先読みを使用することは可能ですが、複数行の正規表現パターンを作成することはできないと思います。私は単一行に正規表現を使用する方法を知っています。これも同じように使用しようとしましたが、期待される出力が得られませんでした。誰でもこれで前進します。

編集:私はxmlの例を入れましたが、実際には複数行の正規表現の一致を知りたいと思っており、失敗しているこのファイルを試しています。XML 解析関連のソリューションは避けてください。

更新:スティーブンの提案に従って、以下が機能しました

pcregrep -M '<starttag name="([^"])*"[^>]*>(\s|<innertag[^>]*>)*<innertag name="[^"]*" value="YYY"\/>(\s|<innertag[^>]*>)*<\/starttag>' file.xml

grep -Pzo '<starttag name="([^"])*"[^>]*>(\s|<innertag[^>]*>)*<innertag name="[^"]*" value="YYY"\/>(\s|<innertag[^>]*>)*<\/starttag>' file.xml
4

2 に答える 2

1

XMLStarlet の使用を検討する

「XMLStarlet はコマンド ライン ユーティリティ (ツール) のセットであり、UNIX の grep、sed を使用してプレーン テキスト ファイルに対して行うのと同様の方法で、シェル コマンドの単純なセットを使用して XML ドキュメントおよびファイルを変換、クエリ、検証、および編集するために使用できます。 、awk、diff、patch、join などのコマンド。」

于 2016-01-28T13:31:32.340 に答える
0

XML パーサー、特に XPath をサポートするパーサーは、はるかに簡単で安定していますが、どうしても正規表現を使用する必要がある場合は、提供されたサンプル入力で機能するパターンを次に示します。

<starttag name="([^"])*"[^>]*>(\s|<innertag[^>]*>)*<innertag name="[^"]*" value="YYY"\/>(\s|<innertag[^>]*>)*<\/starttag>

整形式の XML ドキュメントのすべてのバリエーションで機能するわけではありませんが、例のように一貫してフォーマットされている限り、「問題ありません」。

デフォルトでは、正規表現は常に複数行にわたってキャプチャします。一度に 1 行だけ処理するように指示できるオプションがありますが、通常、デフォルトではオンになっていません。唯一の本当の秘訣は、.パターンが改行文字に一致しないことです。そのため、改行を含む任意の文字に一致させたい場合は、.|\nまたは などの否定文字クラスを使用する必要があります[^>]

于 2016-01-28T13:35:37.707 に答える