Регулярное совпадение, только если строка найдена один раз в нескольких строках - PullRequest
1 голос
/ 15 марта 2019

Подобные вопросы уже задавались ранее, но я не могу найти ничего, что бы соответствовало моему сценарию. Мне нужно регулярное выражение, которое соответствует, только если определенная строка была найдена только один раз в нескольких строках. Учитывая следующие строки:

  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 ]

2 голосов
/ 15 марта 2019

Не дважды в строке: (?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

Примечание - прекратить редактировать мои сообщения, чуваки / чуваки, иначе я пожалуюсь в Управление !!

0 голосов
/ 15 марта 2019

Это было сложно.Предполагая, что данные находятся в файле с именем data и у вас есть GNU Sed, вы идете:

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

(Если использование такого инструмента, как Sed, не вариант, тогда, я думаю, чтовам, вероятно, понадобится какой-нибудь инструмент. Этот трудно сделать с одним регулярным выражением.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...