Регулярні вирази VS Назва файлу глобальна


15

Я знаю, що регулярні вирази використовуються лише з символами та рядками, але іноді я знаходжу їх у назвах файлів. Моє запитання: чи використовуються регулярні вирази лише з символами або також з іменами файлів?

Відповіді:


19

Регулярні вирази та глобальні імена файлів - це дві дуже різні речі.

Регулярні вирази використовуються в командах / функціях для відповідності шаблону в тексті. Наприклад, у параметрі шаблону grepабо в мовах програмування.

Оболонка імен файлів використовується оболонками для узгодження імен файлів та каталогів за допомогою макетів. Можливості глобулінгу залежать від оболонки. Наприклад, Bash підтримує символи, такі як:

  • * відповідати 0 або більше символів
  • ? відповідає 1 символу
  • [...] відповідати символу у вказаному наборі

Ці підстановки можуть виглядати подібними до регулярних виразів, і справді [...]мають однакове значення у глобулінгу та регулярному вираженні. Але *і ?означають різні речі в універсалізації та регулярний вираз.

У коментарі ви написали:

але як різниця перекладача * чи то джокер чи регекс? наприклад: grep a*b a*.txt?

Легко. Типу.

Перш за все, оболонка намагається інтерпретувати підстановку, порівнюючи їх з іменами. Якщо є файли, що починаються з "а" і закінчуються на "b", оболонка замінить a*bвідповідні імена файлів. Те саме стосується a*.txt. Якщо не буде збігаються назви файлів, оболонка передасть аргументи grepбуквально такими, якими вони були.

Однак першим параметром grepмає бути шаблон. У 99,999% випадків практичного використання ви не хочете, щоб перший параметр був інтерпретований оболонкою. Тож, мабуть, наміром було таке:

grep "a*b" a*.txt

Завдяки цитуванню a*bоболонка не буде інтерпретувати її за допомогою глобулінгу, а натомість передасть її безпосередньо grep. У свою чергу, grepтрактуватиме це як регулярний вираз (за конструкцією).

Підсумовуючи це, оболонка інтерпретує командний рядок, дотримуючись власної мови глобалізації, яка використовує підстановку. Команди, програми інтерпретують їх параметри так, як вони були розроблені їхніми авторами.


4

Якщо ім'я файлу є рядком для вас, ви можете використовувати регулярний вираз також для імен файлів. Наприклад: якщо ви хочете знайти імена файлів, які відповідають регексу, ви можете спробувати:

find ./ -regex '.*[abc][xyz].*'

Команда шукає файли, які мають ім’я a, b або c, а потім x, y або z. Це лише один приклад. Є нескінченні можливості.


але як різниця перекладача * чи то джокер чи регекс? наприклад: $ grep a "asterix" b a "asterix" .txt
Гамза

2
Якщо ви використовуєте, find ./ -name 'a*'ви використовуєте * як підстановку. Під час введення find ./ -regex 'a*'ви використовуєте * у регулярному виразі. Важлива відмінність - перемикач -nameабо -regex.
ніхто
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.