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