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. Наруто, интерпретатор регулярных выражений вашей платформы делает правильные вещи здесь: * не является специальным символом, когда он находится в начале регулярного выражения.

Другие вопросы по тегам