com pcregrep
:
<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'
Com o GNU grep
:
<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'
' '\n'
(embora isso signifique que o arquivo inteiro está carregado na memória e assume que ele não contém bytes NUL).
Alguns operadores de PCRE:
-
(?s)
ativa o sinal s
( .
corresponde a delimitadores de linha pares)
-
.(?!</A>)
qualquer caractere desde que não esteja no início de </A>
.
-
.*?
versão não-voraz de .*
-
(:...)
apenas agrupamento.
Ele é enganado por coisas como <![CDATA[</A>]]>
ou não acharia um Word2
expresso como <![CDATA[W]]>ord2>
ou Word2
para o qual você precisaria de um analisador XML. Mas, então, um analisador XML precisaria de uma entrada XML válida, a qual sua amostra não é, a menos que você a inclua em um elemento de nível superior, precisaria ler o arquivo inteiro (mas, geralmente, é muito comum trabalhar com esse formato) potencialmente transformar o conteúdo (expanda as seqüências <![CDATA
e algumas &...;
). E uma expressão xpath dificultaria encontrar esses Word1
em qualquer lugar, incluindo comentários ou tags XML ou atributos.