grep: Когда звезда клини (*) должна совпадать?
Я учусь grep
но у меня возникли трудности с пониманием работы метасимвола клины. Страницы руководства описывают, что *
соответствует предыдущему символу ноль или более раз. Я использую файл с именем test
со следующим содержанием
*a
123ab
1234
abcdef
a?
?
grep 'a*' test
должен соответствовать ноль или более вхождений a
и, как объяснил, печатает каждую строку test
файл в выводе. В документе также описано, что для сопоставления метасимволов, таких как *
им нужно избежать, поставив перед ними обратную косую черту \
, Но выход из grep '*' test
а также grep '\*' test
такой же. Выход: *a
Почему *
сопоставляя себя, не предшествуя ему \
?
2 ответа
*
само по себе недопустимое регулярное выражение, так как нет предыдущего элемента для повторения. Ваша реализация grep, в этом случае, интерпретирует это как литерал *
, \*
является допустимым регулярным выражением, которое соответствует *
, Ваша реализация интерпретирует недопустимое регулярное выражение *
и действительное регулярное выражение \*
просто случилось так же.
Если вы действительно хотите увидеть разницу между *
а также \*
, вы должны попробовать это на правильном регулярном выражении, добавив элемент перед ним. Например, буквальный a
:
grep 'a*'
grep 'a\*'
Бывший будет соответствовать чему угодно с *
может соответствовать нулю символов успешно. Последний будет соответствовать только строки, содержащие a*
в прямом смысле.
Ведущий *
в регулярном выражении действует в соответствии с разделом 9.3.3 SUSv3. Наруто, интерпретатор регулярных выражений вашей платформы делает правильные вещи здесь: *
не является специальным символом, когда он находится в начале регулярного выражения.