Я пытаюсь запустить регулярное выражение 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, которые должны это поддерживать.