E aqui está uma frase simples e simples:
$ gawk '{if(match($0, /^\[ (.+?) \]/, k)){name=k[1]}} {print >name".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 ao awk para combinar 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". name=k[1] apenas salva o valor de k [1] (a correspondência) em uma nova variável name .
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.
Não posso garantir isso, pois nunca usei o shell do Windows, mas estou disposto a apostar que ele será muito mais rápido do que isso também. Gawk / awk são RÁPIDOS.