Я виявив 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
е.