Você pode dividir arquivos com base no conteúdo da linha com csplit
. Este é um comando POSIX , mas o A versão GNU possui algumas extensões úteis. Com o GNU csplit (Linux não integrado, Cygwin), veja como dividir um arquivo em cada linha que começa com <VirtualHost
:
csplit -f 'virtualhost-' -b '%03d.conf' all-sites.conf '/^ *<VirtualHost /' '{*}'
Portably, isso é mais desajeitado. Você precisa contar o número de ocorrências e os nomes dos arquivos de saída terminam com a seqüência de dígitos.
csplit -f 'virtualhost-' all-sites.conf '/^ *<VirtualHost /' "{$(($(grep -c '^ *<VirtualHost <all-sites.conf') - 1))}"
De qualquer forma, o primeiro arquivo contém tudo até a primeira linha <VirtualHost
; pode estar vazio. Se houver comentários antes de uma linha <VirtualHost
, eles não serão anexados à seguinte seção <VirtualHost
; csplit
não é inteligente o suficiente para fazer isso, muito menos descobrir se o comentário se aplica ao conteúdo anterior ou seguinte.
Se você quiser fazer algo mais sofisticado, como nomear os arquivos de saída após o conteúdo, você pode usar o awk. O utilitário csplit é conveniente às vezes, mas o awk pode fazer tudo o que pode fazer sem muita dificuldade.
awk '
BEGIN {output_file = "preamble.conf"}
/^ *<VirtualHost *[^ >]/ {
output_file = "virtualhost-" sub(/ *[:>].*/, "", sub(/^ *<VirtualHost */, "", $0) ".conf";
}
{print >output_file}
' all-sites.conf