Você realmente deveria estar usando um analisador para isso, mas, só assim você sabe, sed -n '/<tag>/,/<\/tag>/p' file.xml
obtém todos os elementos porque você p
rint todos eles. Esse comando funciona endereçando todas as linhas entre uma linha contendo <tag>
e a próxima linha na entrada que contém </tag>
. Como isso faz praticamente todas as suas linhas, apenas p
rinting elas não mostram muita diferença. Algo como o seguinte pode ser um pouco mais próximo da marca:
sed -n '\|<tag>|{:n
\|</tag>|!{N;bn}
y|\n| |;p
}'
Ele aborda <tag>
linhas e as verifica em </tag>
. Se eles não contiverem a cadeia de fechamento, ela puxará outra linha - e fará isso repetidamente até que o espaço de padrão contenha <tag>.*</tag>[^\n]*$
.
Então, eu só traduzo todos os caracteres de ewline \n
no espaço padrão para espaços.
Aqui está novamente:
sed -n '\|<tag>|{:n;\|</tag>|!{N;bn};y|\n| |;p}' <<\DATA
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>
<t1>john</t1>
<t2>john</t2>
<t3>john</t3>
</tag>
<tag>
<t1>john</t1>
<t2>john</t2>
<t3>john</t3>
</tag>
<tag>
<t1>john</t1>
<t2>john</t2>
<t3>john</t3>
</tag>
<tag>
<t1>john</t1>
<t2>john</t2>
<t3>john</t3>
</tag>
</root>
DATA
OUTPUT:
<tag> <t1>john</t1> <t2>john</t2> <t3>john</t3> </tag>
<tag> <t1>john</t1> <t2>john</t2> <t3>john</t3> </tag>
<tag> <t1>john</t1> <t2>john</t2> <t3>john</t3> </tag>
<tag> <t1>john</t1> <t2>john</t2> <t3>john</t3> </tag>
Agora você pode fazer:
sed -n '\|<tag>|{:n
\|</tag>|!{N;bn}
y|\n| |;p
}' ./file |
sed 's|> |>\n|g;2q'
... o que me pega:
<tag>
<t1>john</t1>
<t2>john</t2>
<t3>john</t3>
</tag>
<tag>
<t1>john</t1>
<t2>john</t2>
<t3>john</t3>
</tag>