Меня смущает, ищет ли grep шаблоны, включает ли они кавычки или опускает их, и когда шаблоны обрабатываются буквально в bash.
Мой опыт на данный момент привел меня к убеждению, что grep автоматически обрабатывает шаблон поиска в кавычках как одну строку. Например.:
Если файл.txt содержит:
Welcome to stack*overflow !
Вышеприведенное выглядит как специальный символ *, который можно интерпретировать как одну строку в txt-файле, но также можно интерпретировать оболочкой bash как подстановочный знак перед обработкой его командой grep.
Я понимаю, что кавычки можно использовать для обработки шаблона как одной строки. Если бы я вызвал оболочку bash с кавычками...
> grep "stack*overflow" file.txt
>
... разве оболочка bash не печатает строку, содержащую точную строку «stack*overflow»? Если нет, то почему при таком запуске он не дает никаких результатов?
Аналогично, почему это также не дает никаких результатов, когда я вызываю оболочку bash без кавычек:
> grep stack*overflow file.txt
>
В чем разница между поведением grep с кавычками и без кавычек в оболочке bash?
🤔 А знаете ли вы, что...
Bash поддерживает создание функций для группировки команд и повторного использования кода.
По сути, это дубликат Когда заключать переменную оболочки в кавычки? но давайте рассмотрим конкретно регулярные выражения.
Когда оболочка видит
grep .* file.txt
он расширит подстановочный знак, если сможет; поэтому, если у вас есть файлы с именами .foo
и .bar
, вы будете работать
grep .bar .foo file.txt
т. е. поиск (любого символа, за которым следует) bar
в .foo
и file.txt
, что почти наверняка не то, что вам нужно.
Самый простой и понятный совет — всегда, всегда и без исключений заключать регулярные выражения в кавычки. Одинарные кавычки являются абсолютно лучшими, потому что они цитируют дословно, хотя иногда (например, когда ваше фактическое регулярное выражение должно содержать одинарную кавычку) вам нужно вернуться к двойным кавычкам, а затем понять, что любая обратная галочка, знак доллара или обратная косая черта требуют быть экранированным обратной косой чертой.
Есть крайние случаи, когда пропуск кавычек безопасен, но, вероятно, глуп. Есть также крайние случаи, связанные с тем, как именно оболочка будет расширять подстановочные знаки (nullglob
и т. д.), но если вы убедитесь, что всегда используете регулярные выражения в кавычках, это не имеет значения.
Кстати, вы также, похоже, не понимаете различий между шаблонами подстановочных знаков (glob) оболочки и регулярными выражениями. Stack*
в регулярном выражении ищет Stac
, за которым следует ноль или более вхождений k
, как можно больше. См. также В чем разница между шаблонами в стиле glob и регулярными выражениями? а также, возможно, информационная страница тега регулярного выражения Stack Overflow, которая содержит краткие часто задаваемые вопросы для начинающих и ссылки на учебные ресурсы.
Для поиска буквальной звездочки используйте регулярное выражение \*
или [*]
. Для поиска чего-либо (любого символа, как можно большего количества) регулярное выражение — .*
(любой символ, ноль или более). В этом случае, возможно, вам нужен [^A-Za-z0-9]*
, который ищет как можно больше небуквенно-цифровых символов.