Почему `grep fil *` терпит неудачу?

Я обнаружил, что echo file|grep fil* терпит неудачу, но echo abcd|grep abc* преуспевает.

Я этого не понимаю, может кто-нибудь объяснить?

  • Получение команды tree для отображения каталогов
  • Сценарий оболочки декодирования Url
  • Плитка logfile на куски и поиск ошибок
  • Чувствительность к регистру в квадратных скобках
  • Повторение stdin при запуске ed (1) скрипта
  • Как я могу найти, какие csv-файлы связаны (т. Е. Имеют ссылки на внешние ключи) другим?
  • Оболочка shellscript дает ошибку
  • Как захватить stdin в переменную без удаления любых завершающих строк?
  • One Solution collect form web for “Почему `grep fil *` терпит неудачу?”

    В вашем примере есть две проблемы.

    Основной из них состоит в том, что вы предполагаете, что регулярные выражения работают так же, как и шаблоны glob в том, что * является подстановочным знаком, означающим «любая последовательность символов». В регулярных выражениях * означает «любое число предыдущего атома», поэтому fil* означает f за которым следует i за которым следуют ноль или более l символов. Вы должны сказать grep fil.* Чтобы получить намеченное значение:. означает «любой отдельный символ, так что .* означает «любая последовательность символов».

    Меньшая проблема заключается в том, что вы используете некотируемые специальные символы, которые означают что-то под правилами glob, что означает, что оболочка может их интерпретировать. Если у вас есть файлы в локальном каталоге, соответствующие шаблонам glob fil* или abc* , оболочка будет расширять их , поэтому grep получит расширенные имена файлов в виде шаблона, а не RE. Всякий раз, когда вы используете такие символы в командной строке, вы должны процитировать их: echo file | grep 'fil.*' echo file | grep 'fil.*' .

    Linux и Unix - лучшая ОС в мире.