
Abaixo está o conteúdo do meu arquivo,
<A>
<number>100</number>
<name>Word1</name>
</A>
<A>
<number>101</number>
<name> Word2</name>
</A>
se eu usar grep Word1
, estou tentando ver a saída abaixo,
<A>
<number>100</number>
<name>Word1</name>
</A>
se eu usar grep Word2
, estou tentando ver a saída abaixo,
<A>
<number>101</number>
<name>Word2</name>
</A>
Alguém poderia ajudar com isso, por favor?
Responder1
Se isso fizer parte de um documento XML bem formado, você poderá extrair a parte necessária com um analisador XML.
Para satisfazer obem formadorequisito, envolvi seu fragmento XML com <root>
e </root>
.
xmlstarlet sel -t -c '//A[name="Word1"]' -n file.xml
Se você não puder satisfazer isso diretamente, poderá envolvê-lo explicitamente
( echo '<root>'; cat file.xml; echo '</root>' ) | xmlstarlet sel -t -c '//A[name="Word1"]' -n
Em ambos os casos, a saída é esta:
<A>
<number>100</number>
<name>Word1</name>
</A>
Responder2
Com pcregrep
:
<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'
Com GNU grep
:
<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '\0' '\n'
(embora isso signifique que todo o arquivo seja carregado na memória e presuma que não contém bytes NUL).
Alguns operadores PCRE:
(?s)
ativa as
bandeira (.
corresponde aos delimitadores de linha pares).(?!</A>)
qualquer caractere, desde que não esteja no início de</A>
..*?
versão não gananciosa de.*
(:...)
apenas agrupando.
Ele é enganado por coisas como <![CDATA[</A>]]>
ou não encontraria 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, o que sua amostra não é, a menos que você o inclua em um elemento de nível superior, precisaria ler o arquivo completo (mas, novamente, esse geralmente é o seu destino ao trabalhar com esse formato) e seria potencialmente transformar o conteúdo (expandir o <![CDATA
e algumas &...;
sequências). E uma expressão xpath tornaria difícil encontrá-las Word1
em qualquer lugar, inclusive em comentários ou tags ou atributos XML.