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

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

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

  • передача результатов команды awk в качестве параметра
  • Как создать относительную символическую ссылку, совместимую с POSIX, в / bin / sh?
  • Экспортировать выбор переменных окружения с правильным экранированием
  • Я хочу разделить сумму чисел на значение
  • Завершение скрипта оболочки bash, работающего в фоновом режиме
  • Получить последнюю минуту из строк из списка
  • Как удалить каждый файл с x в заголовке?
  • Grep для строки в первой строке всех файлов в каталоге и потомках
  • 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 - лучшая ОС в мире.