Відповіді:
Ім'я файлів оболонки в глобусі та регулярні вирази використовують одні й ті ж символи, і вони мають подібні цілі, але ви праві, вони не сумісні. Ім'я файлів - це набагато менш потужна система.
У глобальному імені файлу:
*
означає "нуль або більше символів"
?
означає "будь-який єдиний символ"
Але в регулярних виразах ви повинні використовувати, .*
щоб означати "нуль або більше символів", і .
означає "будь-який один символ". A ?
означає щось різне в регулярних виразах: нуль або один екземпляр попереднього елемента RE.
Квадратні дужки ( []
), здається, працюють однаково в обох системах системи, на якій я набираю це, принаймні для простих випадків. Сюди входять такі речі, як класи символів POSIX (наприклад [:alpha:]
). Це означає, що якщо вам потрібні ваші команди для роботи над багатьма різними типами системи, я рекомендую не використовувати нічого, крім елементарних речей, таких як списки символів (наприклад [abeq]
) та, можливо, діапазони символів (наприклад [a-c]
).
Ці відмінності означають, що дві системи є взаємозамінними лише для простих випадків. Якщо вам потрібна відповідність імен файлів з регулярними виразами, потрібно зробити це іншим способом. find -regex
є одним із варіантів. (Зверніть увагу, що існує find -name
, до речі, і синтаксис, що використовує глобус.)
'%'
означає '*'
.
Відповідаючи на питання, висловлене в оригінальній назві:
Чому регулярні вирази відрізняються від тих, які використовуються для фільтрації файлів?
Розширення імені файлів передує регулярним виразам, які вже існували в більшості операційних систем (символи підстановки / джокер) та набагато простіші та інтуїтивніші, ніж останні.
Хоча *.txt
випадкові користувачі легко зрозумілі, аналог .*\.txt
- це щось більш націлене на досвідчених користувачів / програмістів, не кажучи вже про ^.*\.txt$
...
*.txt
не дорівнює .*\.txt
, вона (в основному) дорівнює .*\.txt$
тому, що після .txt
(принаймні, якщо розумне глобальне ім'я файлу) не може бути нічого . Можливо, навіть ^.*\.txt$
дещо залежно від використання. Доводить свою думку?