Когда grep ищет шаблоны в файле с кавычками и/или без кавычек в bash?

Меня смущает, ищет ли 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?

Подсказка: если всегда использовать кавычки: * — это специальный символ, когда grep используется без -F, он означает 0 или более совпадений предыдущего символа, используйте точку . для ЛЮБОГО символа. Используйте -F или пропустите его, если это часть поиска.

Andre Wildberg 03.09.2024 19:27

Этот вопрос похож на: сопоставление строки со звездочкой «*» в grep. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

miken32 04.09.2024 17:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Когда оболочка видит

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]*, который ищет как можно больше небуквенно-цифровых символов.

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

Похожие вопросы

Как извлечь столбцы из файла CSV, обработать и создать файл CSV на основе результата извлечения и обработки?
Скрипт Bash, который принимает несколько аргументов пути и проверяет, можно ли там успешно создать файлы
Почему bash не завершает выполнение сценария после ошибки внутри скобок?
Как запустить эмулятор терминала во время работы оболочки?
Как мне отслеживать и уничтожать все процессы, порожденные запуском сценария, не зная имен подпроцессов?
Bash: медленнее использовать zcat по сравнению с cat+zcat или cat+pv+zcat
Как передать переменную оболочки, возвращаемую из Pythonscript, в другую оболочку для запуска другого Pythonscript в правиле Makefile?
Правильное использование кавычек при подстановке команд – как?
Синтаксическая ошибка рядом с токеном в сценарии bash, инициализирующем conda
Удалите вывод ansi escape из файла журнала с помощью cat/ansifilter или любых других инструментов