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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top