Como dividir arquivo em primeira linha vazia em uma forma portátil com casca (por exemplo, usando sed)?
-
10-07-2019 - |
Pergunta
Eu quero dividir um arquivo containg resposta HTTP em dois arquivos: um contendo apenas cabeçalhos HTTP, e um containg o corpo de uma mensagem. Para essa necessidade eu para dividir um arquivo em dois na primeira linha vazia (ou para obter ferramentas UNIX em primeira linha contendo apenas CR = '\r
' personagem) usando um shell script .
Como fazer isso de uma forma portátil (por exemplo, usando sed , mas sem extensões GNU)? Pode-se supor que a linha vazia não seria primeira linha em um arquivo. linha vazia pode chegou a tanto, nenhum ou ambos os arquivos; não importa para mim.
Solução
$ cat test.txt
a
b
c
d
e
f
$ sed '/^$/q' test.txt
a
b
c
$ sed '1,/^$/d' test.txt
d
e
f
Alterar o /^$/
para /^\s*$/
se você espera pode haver espaços em branco na linha em branco.
Outras dicas
Você pode usar csplit
:
echo "a
b
c
d
e
f" | csplit -s - '/^$/'
ou
csplit -s filename '/^$/'
(assumindo que o conteúdo de "filename" são os mesmos que a saída do eco) criaria, neste caso, dois arquivos com o nome "xx00" e "XX01". O prefixo pode ser alterada de "xx" para "arquivo_de_saída", por exemplo, com -f outfile
e o número de dígitos do nome do ficheiro pode ser alterado para 3 com -n 3
. Você pode usar um regex mais complexo se você precisa lidar com final de linha do Macintosh.
Para dividir um arquivo em cada linha vazia, você pode usar:
csplit -s filename '/^$/' '{*}'
O '{*}'
padrão faz com que o padrão anterior para ser repetido tantas vezes quanto possível.
Dado o script awk
BEGIN { fout="headers" }
/^$/ { fout="body" }
{ print $0 > fout }
awk -f foo.awk < httpfile
vai escrever o headers
dois arquivos e body
para você.
Você pode extrair a primeira parte do seu arquivo (cabeçalhos HTTP) com:
awk '{if($0=="")exit;print}' myFile
e a segunda parte (HTTP corpo) com:
awk '{if(body)print;if($0=="")body=1}' myFile