Соответствовать регулярному выражению между разделителями

У меня есть файл с несколькими строками. Я ищу строки, содержащие (более или менее) шаблон, подобный этому:

\[.*<.*>.*\] 

Другими словами, я хочу, чтобы строки имели <something> между []. Примерами могут быть:

 Line with [ <matching>|<pattern>] A line <that> does[not]<match>[] But [this[<should>]be matched] too [match [me] <buddy>] 

Единственными символами, допускаемыми между <>, являются буквенно-цифровые символы и подчеркивание.

Я пробовал как regexp выше, так и его ленивую версию, но она, похоже, не работала. Какое правильное регулярное выражение?

4 Solutions collect form web for “Соответствовать регулярному выражению между разделителями”

Если ваши пары [ , ] всегда совпадают, и вы не перекрещиваетесь [...] s с <...> , а ваш grep поддерживает параметр -P (например, GNU grep при построении с поддержкой PCRE), вы сможет сделать:

 grep -P '>(?!((?:[^]]|\[(?1)\])*)$)' 

То есть, найдите a > , за которым не следуют только пары [...] . Он использует механизм рекурсивного сопоставления PCREs (?1) .

POSIXly, вы можете сделать это с помощью sed :

 sed ' h; # make a copy of the pristine line on the hold space :1 /\[[^]]*<[^]]*>[^]]*]/{ # found a [...<x>...] g; # retrieve our saved copy and branch off b } s/\[\([^]]*\)]/\1/g; # remove inner [...]s # and loop if that s command was successful t1 # no [...] left to remove, discard this line. d' 

То есть, удалите пары из [...] начиная с внутренних, пока не найдете <...> внутри пары.

(в Solaris или очень старых системах удалите комментарии, поскольку Solaris sed разрешает только комментарии в начале строк).

Этот шаблон с ленивым соответствием (нужен -P AFAIU) работает для меня:

 grep -P '\[[^\]]*?<.*>.*?\]' 

Я придумал следующее решение:

 grep -P '\[[^.\]]*<.*>[^.\[]*\]' filename 

Другими словами, мы сопоставляем пару [и] с парой <и> между ними со следующими ограничениями:

  1. между [] не должны закрывать и открывать скобки соответственно до и после пары <> [^. \]] * ".
  2. внутри <> должен быть хотя бы один символ.

Это решение также намного быстрее, чем регулярное выражение с ленивыми кванторами.

  • Найти первое появление каждого из этих шаблонов с помощью grep
  • как использовать grep для извлечения содержимого строки с несколькими ("), начиная с первой двойной кавычки ко второй
  • Условная grepping
  • Получение уникальных строк с соответствующими строками
  • фильтровать данные по значению столбца
  • grep --exclude не исключает мой файл
  • Как извлечь IP и URL из файла журнала
  • Подсчитайте количество вхождений определенного числа перед каждой строкой в ​​linux
  • Как я могу объединить один столбец вывода в список?
  • Oneliner для определения переменных верблюда
  • grep, чтобы вернуть значение для Referer в trail -f httpd-access.log
  • Linux и Unix - лучшая ОС в мире.