Se o arquivo de entrada couber confortavelmente na memória, mantenha-o simples .
Se o arquivo de entrada for enorme, você poderá csplit
dividi-lo em pedaços no início foo
e, a cada subseqüente bar
, montá- los . As peças são chamadas piece-000000000
, piece-000000001
etc. Escolha um prefixo (aqui piece-
) que não entrará em conflito com outros arquivos existentes.
csplit -f piece- -n 9 - '%foo%' '/bar/' '{*}' <input-file
(Em sistemas não Linux, você precisará usar um grande número dentro dos aparelhos, por exemplo {999999999}
, e passar a -k
opção. Esse número é o número de bar
peças.)
Você pode montar todas as peças com cat piece-*
, mas isso lhe dará tudo após a primeira foo
. Então remova a última peça primeiro. Como os nomes dos arquivos produzidos por csplit
não contêm caracteres especiais, você pode trabalhar com eles sem tomar nenhuma precaução especial de citação, por exemplo, com
rm $(echo piece-* | sed 's/.* //')
ou equivalente
rm $(ls piece-* | tail -n 1)
Agora você pode juntar todas as peças e remover os arquivos temporários:
cat piece-* >output
rm piece-*
Se você deseja remover as peças conforme são concatenadas para economizar espaço em disco, faça-o em um loop:
mv piece-000000000 output
for x in piece-?????????; do
cat "$x" >>output; rm "$x"
done
foo
e o últimobar
e imprimiria tudo o que havia entre eles. Com um fluxo, você teria que ler até o primeirofoo
e armazenar em buffer todas as linhas subseqüentes na memória até o EOF, liberando o buffer sempre quebar
for visto. Isso pode significar armazenar em buffer todo o fluxo na memória.