仅在多行中一次找到字符串时,正则表达式匹配

时间:2019-03-15 20:01:57

标签: regex

以前也曾问过类似的问题,但我找不到能解决我的情况的任何东西。我需要一个仅在多行中仅找到某个字符串的情况下才匹配的正则表达式。给出以下几行:

  20    7c2f.80e9.0b33    DYNAMIC     Gi1/0/27
  20    7c2f.80ee.c28c    DYNAMIC     Gi1/0/47
  20    7c2f.80ee.c2af    DYNAMIC     Gi1/0/47
  20    7c2f.80ee.c2fb    DYNAMIC     Gi1/0/47
  20    7c2f.80f3.6daa    DYNAMIC     Gi1/0/32
  20    7c2f.80f3.6df9    DYNAMIC     Gi1/0/47
  20    7c2f.80f6.f3c8    DYNAMIC     Gi1/0/30
  20    7c2f.80f6.f3fd    DYNAMIC     Gi1/0/29

我需要仅在字符串中一次找到接口时才匹配的正则表达式。到目前为止,我所拥有的,但是却行不通:

(Gi1\/0\/47)[\S\s]*(?!Gi1\/0\/47)

在此处进行测试:https://regex101.com/r/39yJWm/1

因此,例如,如果我使用 Gi1 / 0/27 进行检查,则该匹配项应该会出现,因为它只会发生一次。如果我使用 Gi1 / 0/47 进行检查,则不应给出匹配项,因为它会出现4次。您只需要考虑正则表达式中的一个接口检查,因为我每次都会使用不同的接口遍历结果。

2 个答案:

答案 0 :(得分:2)

字符串中没有两次:(?s)^(?!.*Gi1/0/27.*Gi1/0/27).*Gi1/0/27

 (?s)                              # Dot-all modifier
 ^                                 # BOS
 (?! .* Gi1/0/27 .* Gi1/0/27 )     # Not twice in string
 .* 
 Gi1/0/27                          # Must exist

注意-停止编辑我的帖子花花公子/花花公子,否则我 会向管理层投诉!

答案 1 :(得分:0)

那很棘手。假设数据位于名为data的文件中,并且您具有GNU Sed,则可以执行以下操作:

PAT='Gi1/0/27' && sed -rne '\%'"${PAT}"'$%!d;${p;q0};h;:a;n;\%'"${PAT}"'$%q0;${g;p;q0};ba' data

(如果不选择使用Sed之类的工具,那么,我认为您可能会需要某种工具。仅靠正则表达式很难做到这一点。)