Como faço para sed fazer apenas ações no primeiro jogo?

2

Eu tenho um script bash que extrai cabeçalhos da fonte MIME de um email. A idéia é que eu só quero capturar os cabeçalhos da mensagem nada mais. Não está funcionando direito embora.

Eu quero fazer o seguinte:

1) Comece no topo do email.
2) Isole apenas a parte que começa com "From" (meu servidor de email upstream ALWAYS inicia o cabeçalho com uma linha contendo isso). 3) Capture todas as linhas abaixo dela ATÉ a quebra de linha first .
4) Não se preocupe em capturar informações do restante do email.

Eu pensei que poderia fazer isso com esse padrão de sed: sed -n "/From/,/^$/p"

Infelizmente, é acionado em outras instâncias de "De". Por exemplo, se alguém encaminha uma mensagem e houver conteúdo como:

---------- Forwarded message ----------
From: Newsletter <[email protected]>
Date: Wed, Jan 28, 2015 at 9:16 PM
Subject: Blargenflugent
To: [email protected]

Como posso sedigar o conteúdo após a primeira quebra de linha?

    
por Mike B 07.02.2015 / 23:46

2 respostas

2
sed '/From/,$!d;/./!q' <infile

... a expressão acima instrui sed to d elete da saída de todas as linhas que fazem ! não ficarem no intervalo de /From/ através da $ last line. Cada vez que d elimina uma linha, ele para de ler seu script e recomeça com a próxima linha de entrada do topo - e assim ele não lê o próximo comando.

Portanto, o comando /./!q uit significa sed only q uits entrada na primeira linha após a primeira ocorrência de From em sua entrada, que ! não contém pelo menos um único caractere . .

    
por 08.02.2015 / 00:15
0
sed -n '/From/!p;/From/{s/From/foo/;p;: rest; n; p; b rest;}' file
    
por 07.02.2015 / 23:55