Para evitar que o texto seja dividido entre </Document>
e o próximo <Document>
, talvez seja necessário usar uma série de comandos sed
(cf. comentário de Gilles acima).
Essencialmente sed
lê todo o arquivo no buffer de suspensão (para que o conteúdo do arquivo possa ser tratado como uma única linha) e marca o primeiro e o último Document
tags para processamento posterior.
# version 1
# marker: HERE
cat file.xml |
sed -n '1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/HEREHERE/g;p;}' |
sed -n -e '/HERE<Document>/,/<\/Document>HERE/ p' |
sed -e 's/^ *HERE\(<Document>\)//' -e 's/\(<\/Document>\)HERE *$//'
# version 2 (using the Bash shell)
# marker: $'# version 1
# marker: HERE
cat file.xml |
sed -n '1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/HEREHERE/g;p;}' |
sed -n -e '/HERE<Document>/,/<\/Document>HERE/ p' |
sed -e 's/^ *HERE\(<Document>\)//' -e 's/\(<\/Document>\)HERE *$//'
# version 2 (using the Bash shell)
# marker: $'%pre%1'
cat file.xml |
sed -n $'1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/%pre%1\1%pre%1/g;p;}' |
sed -n -e $'/%pre%1<Document>/,/<\/Document>%pre%1/ p' |
sed -e $'s/^ *%pre%1//' -e $'s/%pre%1 *$//' |
cat -vet
1'
cat file.xml |
sed -n $'1h;1!H;${;g;s/\(<Document>.*<\/Document>\)/%pre%1\1%pre%1/g;p;}' |
sed -n -e $'/%pre%1<Document>/,/<\/Document>%pre%1/ p' |
sed -e $'s/^ *%pre%1//' -e $'s/%pre%1 *$//' |
cat -vet
... mas acho que tudo isso poderia ser feito de forma mais elegante (e confiável) usando xmlstarlet
!