Назад | Перейти на главную страницу

Экранирование специальных символов в регулярном выражении grep

Я пытаюсь запустить регулярное выражение grep в файле, где мне нужно исключить строки, где появляются «00» и «0». Я придумал такое выражение:

grep -a -E \"stored\"\:\ \"\*123\*(?!00)[0-9]{2,5}\#\" $filename

Но когда я пытаюсь запустить его в bash, я либо получаю

-bash !00: event not found, или (как только я наберу set +H),

-bash: syntax error near unexpected token(''

Пожалуйста, что мне нужно сделать, чтобы правильно избежать этого регулярного выражения в bash?

Вы получаете сообщение об ошибке, потому что вы не сбежали !, который имеет особое значение в оболочке. Чтобы использовать это как часть параметра шаблона grep, вы должны процитировать это или избежать.

Вместо того, чтобы цитировать каждый специальный символ по одному, гораздо проще заключить весь шаблон в одинарные или двойные кавычки (в зависимости от вашей цели), например:

grep -a -P '"stored": "*123*(?!00)[0-9]{2,5}#"'

Также обратите внимание, что я заменил -E с участием -P, потому что отрицательный прогноз (?!...) не работает в типичных реализациях grep расширенное регулярное выражение. В -P flag включает регулярные выражения Perl, которые должны это поддерживать.