【问题标题】:Bash regex for same sender and receiver with backreference具有反向引用的相同发送者和接收者的 Bash 正则表达式
【发布时间】:2020-08-07 07:17:15
【问题描述】:

我尝试制作一个正则表达式(重要的是它是一个正则表达式,因为我需要它用于fail2ban)以匹配何时 接收方和发送方是同一个人:

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

我做错了什么?

【问题讨论】:

  • 您可以使用反向引用 from=&lt;([^\s@&lt;&gt;]+@[^\s@&lt;&gt;]+)&gt;\s*to=&lt;\1&gt; 并且如果支持 grep -oP 选项 regex101.com/r/V18mbR/1 就像 echo "from=&lt;test@test.ch&gt; to=&lt;test@test.ch&gt;" | grep -oP 'from=&lt;([^\s@&lt;&gt;]+@[^\s@&lt;&gt;]+)&gt;\s*to=&lt;\1&gt;'

标签: regex linux bash shell grep


【解决方案1】:

您可以使用模式来匹配括号之间的字符串格式以及对该捕获的反向引用。

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

说明

  • from 字面匹配
  • (捕获组1
    • =&lt; 字面匹配
    • [^\s@&lt;&gt;]+ 匹配除空格字符或 @ &lt; &gt; 之外的任何字符的 1 次以上
    • @ 字面匹配
    • [^\s@&lt;&gt;]+ 再次匹配除空格字符或 @ &lt; &gt; 以外的任何字符的 1 次以上
    • &gt; 字面匹配
  • )关闭第一组
  • \s*to\1 匹配 0+ 个空格字符、to 和对第 1 组的反向引用

Regex demo | Bash demo

对于 Perl 兼容的正则表达式,使用 grep -P 而不是 -E

例如

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

更广泛的匹配可能是捕获括号之间的内容

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

Regex demo

【讨论】:

  • 第一个正则表达式可以简化为 `grep -oP 'from(=]+>)\s*to\1' 吗?
  • @Philippe 是的,这也是可能的,请参阅regex101.com/r/PIUhh7/1 这取决于您希望匹配的具体程度。
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2015-07-28
  • 2016-12-04
  • 1970-01-01
相关资源
最近更新 更多