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.