Ответы:
Вы ищете не жадный (или ленивый) матч. Чтобы получить не жадное совпадение в регулярных выражениях, вам нужно использовать модификатор ?после квантификатора. Например, вы можете изменить .*на .*?.
По умолчанию 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, который работает после попытки вещи в этой теме:
echo "hi how are you " | grep -shoP ".*? "
Просто убедитесь, что вы добавляете пробел к каждой из ваших строк
(Мой был построчным поиском, чтобы выплевывать слова)
-shoPхорошая мнемоника :)
echo "bbbbb" | grep -shoP 'b.*?b'немного опыта обучения. Единственная вещь, которая работала для меня с точки зрения явно ленивый, а также.
grepДля не жадных совпадений grepвы можете использовать отрицательный класс символов. Другими словами, старайтесь избегать подстановочных знаков.
Например, чтобы извлечь все ссылки на файлы JPEG из содержимого страницы, вы должны использовать:
grep -o '"[^" ]\+.jpg"'
Для работы с несколькими строками xargsсначала проложите ввод . Для производительности используйте ripgrep.
Краткий ответ использует следующее регулярное выражение:
(?s)<car .*? model=BMW .*?>.*?</car>
(Немного) более сложный ответ:
(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>
Это позволит сопоставить car1 и car2 в следующем тексте
<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
Извините, я опоздал на 9 лет, но это может сработать для зрителей в 2020 году.
Итак, предположим, у вас есть такая строка "Hello my name is Jello". Теперь вы хотите найти слова, которые начинаются с 'H'и заканчиваются 'o', с любым количеством символов между ними. И мы не хотим строк, мы просто хотим слова. Для этого мы можем использовать выражение:
grep "H[^ ]*o" file
Это вернет все слова. Это работает так: это позволит использовать все символы вместо пробелов между ними, таким образом, мы можем избежать нескольких слов в одной строке.
Теперь вы можете заменить символ пробела на любой другой символ, который вы хотите. Предположим, что исходная строка была "Hello-my-name-is-Jello", тогда вы можете получить слова, используя выражение:
grep "H[^-]*o" file
Я знаю, что это немного мертвый пост, но я только заметил, что это работает. Это убрало и очистку и очистку из моего вывода.
> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20