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

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

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

Другими словами, я хочу, чтобы строки имели <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. внутри <> должен быть хотя бы один символ.

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

  • GNU Parallel - grepping n строк для m регулярных выражений
  • сопоставлять и печатать несколько столбцов из двух файлов
  • Как использовать grep для поиска только в первой строке файлов для определенной строки?
  • Соответствующая ячейка Grep файла csv и индекс этой строки
  • Есть ли способ исключить вложенный подкаталог, указанный по пути к этому директору из рекурсивного поиска grep?
  • grep IP-адреса в сценарии ожиданий
  • vim: grep, используя опцию bash 'globstar'
  • Как игнорировать строки начинаются с # с помощью grep / awk
  • Найти файлы, содержащие строку в имени файла и другую строку в файле?
  • PID PID некоторых процессов UNIX в ls -l
  • Текст grep / parse
  • помочь построить grep-выход
  • Linux и Unix - лучшая ОС в мире.