Meu script usando awk :
#!/bin/bash
for i in $(seq -w $(<"$1" grep -cx "$2")); do
<"$1" >$i awk -va=$i -vb="$2" -vc="$3" '$0~b{d++;e=1}d==a&&e==1;$0~c{e=0}'
done
Salvar como, por exemplo, myscript.sh , torne-o executável, navegue até seu onebig.xml e chame assim:
/path/to/myscript.sh onebig.xml HEAD TAIL
Ele cortará todas as seções de onebig.xml , começando com HEAD e terminando com TAIL , e as salvará como 1 , 2 ,… se houver menos de 10 seções, como 01 , 02 ,… se houver 10 a 99 seções, como 001 , 002 ,… se houver 100 a 999 seções e assim por diante.
Explicações breves
-
<"$1" grep -cx "$2" - conta ocorrências de HEAD em onebig.xml , digamos que é 3
-
for i in $(seq -w 3); do …; done - percorre todas as ocorrências de 1 a 3 , seq a opção -w adiciona zeros à direita, se necessário
-
<"$1" >$i - leu onebig.xml e escreveu em um arquivo com o nome da contagem atual
-
awk -va=$i -vb="$2" -vc="$3" - inicie awk e atribua três variáveis, a sendo a contagem, b sendo HEAD e c sendo TAIL
-
$0~b{d++;e=1} - se a linha atual contiver o conteúdo de b (= HEAD ), aumente d em um e defina e=1
-
d==a&&e==1 - se d for igual a a (= a contagem atual) e e for igual a 1 , em seguida, imprima a linha atual ( print é a ação implícita; essencialmente é: se for após a a a ocorrência de HEAD e estamos entre HEAD e TAIL e depois imprimimos)
-
$0~c{e=0} - se a linha atual contiver o conteúdo de c (= TAIL ), defina e=0