Чому помилка `grep fil *`?


9

Я виявив echo file|grep fil*невдачі, але echo abcd|grep abc*вдається.

Я цього не розумію, може хтось пояснить?


Чи можете ви додати систему та версію grep? Це тому, що з gnugrep 2.16 (під Ubuntu 14.04 LTS) він не генерує жодної помилки (вихідний код 0) і відповідає першим трьом буквам. Наприклад, echo file|grep fil*відповіді з filе.
Гастур

3
@Hastur Проблема викликана розширенням імені файлу перед регулярним виразом. Мій робочий каталог містить файл з префіксом fil, але не файл з префіксом abc, тому fil * замінюється ім'ям файлу, але abc * не змінюється.
tmpbin

Дякую, я не думав про це. Коли я роблю свої спроби, я спробую їх у новому каталозі ...
Гастур,

Відповіді:


31

У вашому прикладі є дві проблеми.

Основна з них полягає в тому, що ви припускаєте, що регулярні вирази працюють так само, як шаблони глобуса. Це *є символом підстановки, що означає "будь-яку послідовність символів". У регулярних виразах *натомість означає "будь-яке число попереднього атома", тому fil*означає, fза яким iслідує нуль або більше lсимволів. Вам потрібно сказати, grep fil.*щоб отримати задумане значення: .означає "будь-який окремий символ, тобто це .*означає" будь-яку послідовність символів ".

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.