次の形式の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