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

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

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

  • Какие оболочки имеют функции, где «local» не изменяет экспортированные переменные для дочерних процессов?
  • Список файлов с меткой времени с эпохи
  • Как перезапустить скрипт Python автоматически, если он убит или умирает
  • Существуют ли соглашения об именах для переменных в сценариях оболочки?
  • Баш-оболочка, запущенная forkpty (), порождает дочерние процессы, игнорирующие SIGINT. Почему и как я могу гарантировать, что SIGINT не игнорируется?
  • Как запустить команду на TTY из сеанса SSH?
  • Где scp помещал эти файлы?
  • Извлечение файлов в текущий каталог
  • 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 - лучшая ОС в мире.