Я хочу получить кратчайшее совпадение, и шаблон должен быть примерно таким:
<car ... model=BMW ...>
...
...
...
</car>
... означает любой символ и ввод состоит из нескольких строк.
Я хочу получить кратчайшее совпадение, и шаблон должен быть примерно таким:
<car ... model=BMW ...>
...
...
...
</car>
... означает любой символ и ввод состоит из нескольких строк.
Ответы:
Вы ищете не жадный (или ленивый) матч. Чтобы получить не жадное совпадение в регулярных выражениях, вам нужно использовать модификатор
?
после квантификатора. Например, вы можете изменить.*
на.*?
.По умолчанию
grep
не поддерживает не жадные модификаторы, но вы можете использоватьgrep -P
для использования синтаксиса Perl.источник
.
сопоставлять символы новой строки, называется режимом DOTALL или однострочным ; Ruby - единственный, кто называет это многострочным . В других вариантах многострочный - это режим, который позволяет якорям (^
и$
) совпадать на границах линий. Ruby не имеет эквивалентного режима, потому что в Ruby они всегда работают таким образом.-P
был совершенно новым для меня, я радостно трепал много лет, и только используя-E
... так много потраченных лет! - Примечание для себя: перечитайте страницы справочника как обычную вещь, и вы никогда не перевариваете достаточно переключателей и опций.grep
не поддерживает-P
, но если вы используете,egrep
вы можете использовать.*?
шаблон для достижения того же результата.egrep -o 'start.*?end' text.html
-P
но-E
будет вызывать,egrep
следовательно, предлагаемая работа.*?
работает отлично.На самом деле
.*?
только работает вperl
. Я не уверен, каков будет эквивалентный синтаксис расширенного регулярного выражения grep. К счастью, вы можете использовать синтаксис perl с grep, такgrep -P
что это будет работать, ноgrep -E
это то же самое,egrep
что не будет работать (это было бы жадно).Смотрите также: http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
источник
grep -P
не работает в GNU grep 2.9 - только что попробовал (это не ошибка, просто молча не применяет?
. Intertestly и не делает класс, например:env|grep '[^\=]*\='
grep -P
опций илиpgrep
команд, ноegrep
отлично работает.pgrep
моем окне OS X 10.9 есть команда, но это совершенно другая программа, цель которой - «найти или сообщить о процессах по имени».Мой grep, который работает после попытки вещи в этой теме:
Просто убедитесь, что вы добавляете пробел к каждой из ваших строк
(Мой был построчным поиском, чтобы выплевывать слова)
источник
-shoP
хорошая мнемоника :)echo "bbbbb" | grep -shoP 'b.*?b'
немного опыта обучения. Единственная вещь, которая работала для меня с точки зрения явно ленивый, а также.grep
Для не жадных совпадений
grep
вы можете использовать отрицательный класс символов. Другими словами, старайтесь избегать подстановочных знаков.Например, чтобы извлечь все ссылки на файлы JPEG из содержимого страницы, вы должны использовать:
Для работы с несколькими строками
xargs
сначала проложите ввод . Для производительности используйтеripgrep
.источник
Краткий ответ использует следующее регулярное выражение:
(Немного) более сложный ответ:
Это позволит сопоставить car1 и car2 в следующем тексте
источник
Извините, я опоздал на 9 лет, но это может сработать для зрителей в 2020 году.
Итак, предположим, у вас есть такая строка
"Hello my name is Jello"
. Теперь вы хотите найти слова, которые начинаются с'H'
и заканчиваются'o'
, с любым количеством символов между ними. И мы не хотим строк, мы просто хотим слова. Для этого мы можем использовать выражение:Это вернет все слова. Это работает так: это позволит использовать все символы вместо пробелов между ними, таким образом, мы можем избежать нескольких слов в одной строке.
Теперь вы можете заменить символ пробела на любой другой символ, который вы хотите. Предположим, что исходная строка была
"Hello-my-name-is-Jello"
, тогда вы можете получить слова, используя выражение:источник
Я знаю, что это немного мертвый пост, но я только заметил, что это работает. Это убрало и очистку и очистку из моего вывода.
источник