Sed/Awk сохраняет текст между шаблонами, если содержит строку

Sed/Awk сохраняет текст между шаблонами, если содержит строку

У меня проблема с почтой. Мне нужно получить все сообщения между 2 людьми: [email protected]и [email protected].

: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>

Я пробовал использовать следующее sed:

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

В результате я получил все письма от someone1 в test.txtфайл.

Вопрос: Какова должна быть структура, sedчтобы получать письма только между somebody1 и person?

решение1

С sed:

sed -n '/^From: [email protected]/{h;n;/^to: [email protected]/{H;g;p;:x;n;p;s/.//;tx}}' file

  • /^From: [email protected]/: сначала найдите From:адрес электронной почты
    • h;сохраните эту строку в отсеке для хранения.
    • n;загрузить следующую строку ( to:строку).
  • /^to: [email protected]/: поиск to:адреса электронной почты
    • H;добавьте эту строку в поле удержания.
    • g;скопировать область удержания в область шаблона.
    • p;распечатать шаблон пространства.
    • :x;установите метку под названием x.
    • n;загрузить следующую строку (тело письма)
    • p;распечатайте эту строку.
    • s/.//сделайте замену в этой строке (просто замените один символ)...
    • tx... что tкоманда может проверить, была ли эта замена успешной (когда строка не пустая, как в конце тела письма). Если да, то перейти обратно к метке xи повторять, пока не появится пустая строка, если нет, то перейти к концу скрипта.

Выход:

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

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

решение2

С 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} \При совпадении установите переменную-флаг на 1 и пропустите строку.
  • /to\: person1/ Если флаг равен 1, обновите его до 2, в противном случае сбросьте до 0.
  • /From/{flag=0} При совпадении значение флага сбрасывается.
  • {if (flag==2){print NR, $0}}если флаг равен 2, он выведетномер строкии линия.

Измените значение, person1чтобы получить другие соответствия.

Входной файл используется

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>

Связанный контент