Sed / Awk salvar texto entre padrões se contiver string

2

Estou enfrentando um problema com os e-mails. Preciso receber todas as mensagens entre duas pessoas: [email protected] e [email protected] .

O file :

From: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message1>

Eu tentei usar o seguinte sed :

sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt

Como resultado, recebi todos os e-mails de alguém1 para test.txt file.

A pergunta é: qual deve ser a estrutura de sed para obter apenas e-mails entre alguém1 e pessoa?

    
por wtk 13.10.2015 / 12:55

2 respostas

1

com sed :

sed -n '/^From: [email protected]/{h;n;/^to: [email protected]/{H;g;p;:x;n;p;s/.//;tx}}' file
  • /^From: [email protected]/ : primeira pesquisa para o endereço de email From:
    • h; armazena essa linha no espaço de espera.
    • n; carrega a próxima linha (a linha to: ).
  • /^to: [email protected]/ : pesquise o to: endereço de e-mail
    • H; anexa essa linha ao espaço de espera.
    • g; copie o espaço de espera para o espaço de padrão.
    • p; imprime o espaço padrão.
    • :x; definiu um rótulo chamado x .
    • n; carrega a próxima linha (o corpo do email)
    • p; imprime essa linha.
    • s/.// faz uma substituição nessa linha (apenas substitua um caractere) ...
    • tx ... que o comando t pode verificar se essa substituição foi bem-sucedida (quando a linha não está vazia, como no final do corpo do email). Se sim, volte para o marcador x e repita até aparecer uma linha vazia, se não pular para o final do script.

A saída:

From: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message1>
    
por 13.10.2015 / 14:25
0

com o awk:

awk '/From: [Ss]omebody1/{flag=1;next} \
  /to\: person1/ {if (flag>0) {flag=2; print; next} else {flag=0; next}} \
 /From/{flag=0} {if (flag==2){print NR,flag, $0}} ' input.txt 
  • /From: [Ss]omebody1/{flag=1;next} \ Coloque uma variável de sinalizador em 1 na partida e pule a linha.
  • /to\: person1/ Se o sinalizador for 1, atualize-o para 2, redefina-o para 0.
  • /From/{flag=0} Na partida, redefiniu o valor da sinalização.
  • {if (flag==2){print NR, $0}} se o sinalizador for 2, imprimirá o linenumber e a linha.

Altere o valor de person1 para diferentes correspondências.

Arquivo de entrada usado

From: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message2>

From: [email protected]
to: [email protected]
<body of the message3>

From: [email protected]
to: [email protected]
<body of the message4>

From: [email protected]
to: [email protected]
<body of the message5>
    
por 13.10.2015 / 14:48