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

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

Estou enfrentando um problema com e-mails. Preciso receber todas as mensagens entre 2 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.txtarquivar.

A pergunta é: Qual deve ser a estrutura para sedreceber apenas e-mails entre alguém1 e pessoa?

Responder1

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 pelo From:endereço de e-mail
    • h;armazene essa linha no espaço de espera.
    • n;carregue a próxima linha (a to:linha).
  • /^to: [email protected]/: procure o to:endereço de e-mail
    • H;anexe essa linha ao espaço de espera.
    • g;copie o espaço de espera para o espaço padrão.
    • p;imprima o espaço do padrão.
    • :x;defina um rótulo chamado x.
    • n;carregue a próxima linha (o corpo do email)
    • p;imprima essa linha.
    • s/.//faça uma substituição nessa linha (basta substituir um caractere)...
    • tx... que o tcomando possa verificar se aquela substituição foi bem sucedida (quando a linha não está vazia, como no final do corpo do email). Se sim, volte para o rótulo xe repita até que uma linha vazia apareça, se não, pule 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>

Responder2

Com 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 flag em 1 na partida e pule a linha.
  • /to\: person1/ Se o sinalizador for 1, atualize-o para 2, caso contrário, redefina-o para 0.
  • /From/{flag=0} Na partida, ele redefiniu o valor do sinalizador.
  • {if (flag==2){print NR, $0}}se o sinalizador for 2, ele imprimirá onúmero da linhae a linha.

Altere o valor de person1para ter correspondências diferentes.

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>

informação relacionada