Как сделать не жадный матч в 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