Ответы:
Вы ищете не жадный (или ленивый) матч. Чтобы получить не жадное совпадение в регулярных выражениях, вам нужно использовать модификатор ?
после квантификатора. Например, вы можете изменить .*
на .*?
.
По умолчанию 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