Как сделать не жадный матч в grep?


Я хочу, чтобы grep самый короткий матч и шаблон должен быть что-то вроде:

<car ... model=BMW ...>
...
...
...
</car>

... означает любой символ, а вход-несколько строк.

5 133

5 ответов:

вы ищете не жадный (или ленивый) матч. Для получения не жадного соответствия в регулярных выражениях необходимо использовать модификатор ? после квантификатора. Например, вы можете изменить .* to .*?.

по умолчанию grep не поддерживает не-жадные модификаторы, но вы можете использовать grep -P для использования синтаксиса Perl.

на самом деле .*? работает только в perl. Я не уверен, что эквивалентный синтаксис расширенного регулярного выражения grep будет. К счастью, вы можете использовать синтаксис perl с grep so grep -P, а grep -E что же egrep не будет работать (это было бы жадно).

Смотрите также:http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html

мой grep, который работает после опробования материала в этой теме:

echo "hi how are you " | grep -shoP ".*? "

просто убедитесь, что вы добавляете пробел к каждой из ваших строк

(мой был строчный поиск, чтобы выплюнуть слова)

grep

для не-жадного матча в grep вы можете использовать отрицательный класс символов. Другими словами, старайтесь избегать шаблонов.

например, чтобы извлечь все ссылки на файлы jpeg из содержимого страницы, вы должны использовать:

grep -o '"[^" ]\+.jpg"'

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

короткий ответ использует следующее регулярное выражение:

(?s)<car .*? model=BMW .*?>.*?</car>
  • (?s) - это делает матч через многострочный
  • .* ? - соответствует любому символу, несколько раз лениво (минимально матч)

(немного) более сложный ответ:

(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</>

Это позволит сопоставить car1 и car2 в следующем тексте

<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
  • (..) представляет собой группу захвата
  • \1 в этом контекст соответствует sametext, как последний соответствует захват группы № 1