Procurando instâncias duplicadas de uma tag em um arquivo

3

Vários fragmentos de código existem em um arquivo semelhante ao seguinte:

<blah>Spread the peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> on good looking bread <ramout assot="f0123_fun10" bapel="3 or 5"/> that does not have peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> already on the bread this that and the other <ramout assot="f0123_fun10" bapel="4"/> with something else.</blah>

Estou tentando encontrar instâncias duplicadas da tag de ramout em um único arquivo. Se o seguinte existir:

<ramout assot="f0123_fun10" bapel="2 or 6"/> 

Eu quero saber se ele é repetido novamente dentro das tags blah de abertura e fechamento.

Eu tentei várias coisas, mas uma das últimas foi a seguinte:

grep -Eoi '<blah>.*([[:space:]]<ramout assot).*.*</blah>' *.xml | less

que não retornou nada.

Eu também tentei:

 grep -Eio '<blah>.*([[:space:]]<ramout assot="[a-z][0-9]{5}_fig[0-9]+" bapel="[0-9]+.*)' *.xml

que não inclui a referência anterior, mas também não mostra todos os resultados. Parece que isso está mostrando apenas os resultados que são uma linha única (não se estende por mais de uma linha).

Devo usar sed se quiser pesquisar algo que pode ou não estar em uma linha?

O awk é um candidato viável? Eu vi e tentei: awk '/ Start padrão /, / End padrão /' filename que retornou mais resultados, mas ainda não estou obtendo todos os resultados.

Qualquer ajuda para encontrar a) todos os resultados em todo o arquivo e separadamente b) todos os resultados que são duplicados dentro de tags blah serão apreciados.

Os resultados esperados seriam semelhantes a:

resultados da pesquisa a) mostrando todos os resultados da ramout:

<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="3 or 5"/>
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/>

resultados da pesquisa b) mostrando resultados duplicados:

<ramout assot="f0123_fun10" bapel="2 or 6"/>
    
por regexnoob 12.03.2017 / 00:42

2 respostas

2

Usando XMLStarlet (às vezes instalado ass xmlstarlet em vez de apenas xml ) para extrair as tags relevantes, então sort e uniq para encontrar as duplicatas:

$ xml sel -t -m '/blah/ramout' -c '.' -nl test.xml | sort | uniq -d
<ramout assot="f0123_fun10" bapel="2 or 6"/>

O comando xml corresponderá a todas as tags <ramout> diretamente sob a tag <blah> e, para cada uma delas, copiará a tag seguida por uma nova linha para a saída padrão.

sort sorts e uniq -d irão analisar quaisquer entradas duplicadas da saída de sort .

    
por 12.03.2017 / 14:26
0

Algo como isto funciona bem nos meus testes:

awk -F"/>" -v RS="<ramout assot=" 'NR>1{print RS $1 FS}' file1

echo "Finding Cuplicates:"
awk -F"/>" -v RS="<ramout assot=" 'NR==1{next}seen[$1]++==1{print RS $1 FS}' file1

<ramout assot="f0123_fun10" bapel="2 or 6"/> 
<ramout assot="f0123_fun10" bapel="3 or 5"/> 
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/> 
Finding Cuplicates:              
<ramout assot="f0123_fun10" bapel="2 or 6"/>  

Teste on-line aqui

Aproveitamos o awk capabilitie para declarar um separador de registro personalizado (RS) e um separador de campo personalizado (FS). Acima de dois comandos podem ser combinados em um só ofício, isso foi apenas um teste.

    
por 12.03.2017 / 14:05