Как сделать не жадный матч в grep?
Я хочу, чтобы grep самый короткий матч и шаблон должен быть что-то вроде:
<car ... model=BMW ...>
...
...
...
</car>
... означает любой символ, а вход-несколько строк.
5 ответов:
вы ищете не жадный (или ленивый) матч. Для получения не жадного соответствия в регулярных выражениях необходимо использовать модификатор
?после квантификатора. Например, вы можете изменить.*to.*?.по умолчанию
grepне поддерживает не-жадные модификаторы, но вы можете использоватьgrep -Pдля использования синтаксиса Perl.
на самом деле
.*?работает только вperl. Я не уверен, что эквивалентный синтаксис расширенного регулярного выражения grep будет. К счастью, вы можете использовать синтаксис perl с grep sogrep -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