Bash регулярное выражение для одного и того же отправителя и получателя с обратной ссылкой - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь создать регулярное выражение (важно, что это регулярное выражение, потому что оно мне нужно для fail2ban), чтобы оно соответствовало, когда получатель и отправитель - одно и то же лицо:

echo "from=<test@test.ch>    to=<test@test.ch>" | grep -E -o  '([^=]*\s)[ ]*\1'

Что я делаю не так?

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете использовать шаблон для соответствия формату строки в скобках с обратной ссылкой на этот захват.

from(=<[^\s@<>]+@[^\s@<>]+>)\s*to\1

Объяснение

  • from Буквальное совпадение
  • ( Группа захвата 1
    • =< Буквальное совпадение
    • [^\s@<>]+ 1+ совпадение любого символа, кроме символа пробела или @ < >
    • @ Буквальное соответствие
    • [^\s@<>]+ Снова сопоставить 1+ раз любой символ, кроме символа пробела или @ < >
    • > Буквальное соответствие
  • ) Закрытие группы 1
  • \s*to\1 Сопоставление 0+ пробельных символов, to и обратная ссылка на группу 1

Regex demo | Bash демонстрация

Используйте grep -P вместо -E для Perl совместимых регулярных выражений.

Например,

echo "from=<test@test.ch>    to=<test@test.ch>" | grep -oP  'from(=<[^\s@<>]+@[^\s@<>]+>)\s*to\1'

Немного более широкое совпадение может заключаться в том, что находится между скобками

[^=\s]+(=<[^<>]+>)\s*[^=\s]+\1

Regex demo

...