Se o arquivo de entrada couber confortavelmente na memória, mantenha-o simples .
Se o arquivo de entrada for enorme, você poderá csplitdividi-lo em pedaços no início fooe, a cada subseqüente bar, montá- los . As peças são chamadas piece-000000000, piece-000000001etc. 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 -kopção. Esse número é o número de barpeç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 csplitnã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
fooe o últimobare imprimiria tudo o que havia entre eles. Com um fluxo, você teria que ler até o primeirofooe armazenar em buffer todas as linhas subseqüentes na memória até o EOF, liberando o buffer sempre quebarfor visto. Isso pode significar armazenar em buffer todo o fluxo na memória.