E aqui está uma frase simples e simples:
$ gawk '/^\[/{match($0, /^\[ (.+?) \]/, k)} {print >k[1]".txt" }' entry.txt
Isso funcionará para qualquer tamanho de arquivo, independentemente do número de linhas em cada entrada, desde que cada cabeçalho de entrada se pareça com [ blahblah blah blah ] . Observe o espaço logo após a abertura [ e pouco antes do fechamento ] .
EXPLICAÇÃO:
awk e gawk leem um arquivo de entrada linha a linha. Conforme cada linha é lida, seu conteúdo é salvo na variável $0 . Aqui, estamos dizendo gawk para corresponder a qualquer coisa entre colchetes e salvar sua correspondência na matriz k .
Assim, toda vez que a expressão regular for correspondida, ou seja, para cada cabeçalho no seu arquivo, k [1] terá a região correspondente da linha. Ou seja, "entry1", "entry2" ou "entry3" ou "entryN".
Finalmente, imprimimos cada linha em um arquivo chamado <whatever value k currently has>.txt , ie entry1.txt, entry2.txt ... entryN.txt.
Este método será muito mais rápido que o perl para arquivos maiores.