Это файл я использую:
Shane is a little to play ball small silly
Когда я использую
egrep 's.*l' new
Я получаю вывод как
Shane is a little to play ball small silly
Когда я использую
egrep 's.*?l' new
Я получаю тот же вывод как выше, но это должно отличаться.
Хотя Вы говорите, что "это должно отличаться", Вы забыли говорить, что производит Вас, ожидают. Насколько я знаю, возможные интерпретации ?
в регулярном выражении:
В основном регулярном выражении (BRE), ?
литеральный вопросительный знак; так как Ваш вход не содержит таких символов, вывода grep 's.*?l' new
будет пусто.
В расширенном регулярном выражении (ERE), ?
нуль значения квантора или один из предыдущего regex атома. В этом случае, .*?
означает "нуль или больше отдельных символов (.*
), повторенный нуль или одно время (?
)" - это эквивалентно .*
, и следовательно egrep 's.*?l'
и egrep 's.*l'
произведет идентичный вывод.
В жемчуге совместимом регулярном выражении (PCRE), ?
модификатор жадности, такой что .*?
в s.*?l
соответствует самой короткой последовательности символов между s
и l
тогда как жадное s.*l
соответствует самому длинному такая последовательность. Следовательно
$ grep -P 's.*?l' new
Shane is a little to play ball
^^^^^
в то время как
$ grep -E 's.*?l' new
Shane is a little to play ball
^^^^^^^^^^^^^^^^^^^^^^^
Для простых случаев можно достигнуть "лени" без PCRE ?
модификатор при помощи отрицаемого набора символов т.е.
grep 's[^l]*l' new
будет соответствовать s
сопровождаемый любыми символами кроме l
, сопровождаемый l
.
В СТОРОНЕ: egrep
технически удерживается от использования - необходимо привыкнуть использовать плоскость использования grep
для BRE, grep -E
поскольку ДО, и grep -P
для PCRE.
Простыми словами существуют регулярные выражения POSIX и затем существуют различные расширения, такие как Совместимые с Perl регулярные выражения (PCRE), которые реализованы на многих языках (не просто Perl). Нежадный модификатор *? PCRE-определенное расширение. В регулярных выражениях POSIX это не будет иметь никакого особого значения, и это просто расценит? как избыточный.
В grep можно легко переключиться на режим PCRE с -P
модификатор командной строки.