Você pode usar o awk para o trabalho:
$ curl -o example.vcf http://qt.gitorious.org/qt-mobility/contacts/blobs/raw/\
d7f10927176b8c3603efaaceb721b00af5e8605b/demos/qmlcontacts/contents/example.vcf
$ gawk ' /BEGIN:VCARD/ { ++a; fn=sprintf("card_%02d.vcf", a);
print "Writing: ", fn } { print $0 >> fn; } ' example.vcf
Writing: card_01.vcf
Writing: card_02.vcf
Writing: card_03.vcf
Writing: card_04.vcf
Writing: card_05.vcf
Writing: card_06.vcf
Writing: card_07.vcf
Writing: card_08.vcf
Writing: card_09.vcf
$ cat card_0* > all.vcf
$ cmp example.vcf all.vcf
$ echo $?
0
Detalhes
A linha awk funciona assim: a
é o contador que é incrementado em cada linha BEGIN:VCARD
e ao mesmo tempo o nome do arquivo de saída é construído usando sprintf (armazenado em fn
). Para cada linha, a linha atual ( $0
) é anexada ( >>
) ao arquivo atual (denominado fn
).
O último echo $?
significa que o cmp
foi bem-sucedido, ou seja, todos os arquivos individuais concatenados são iguais ao exemplo original do vcf.
Observe que a linha awk assume que você não possui arquivos com o nome card_[0-9][0-9].vcf
em seu diretório de trabalho atual. Você também pode substituí-lo por algo como
$ gawk ' /BEGIN:VCARD/ { ++a; fn=sprintf("card_%02d.vcf", a);
print "Writing: ", fn; print $0 > fn; next }
{ print $0 >> fn; } ' example.vcf
que sobrescreveria os arquivos existentes.