Регулярные выражения VS Глобализация имени файла
Я знаю, что Регулярные выражения должны использоваться только с символами и строками, но иногда я нахожу их в именах файлов. Мой вопрос: регулярные выражения используются только с символами или также с именами файлов?
2 ответа
Регулярные выражения и глобализация имен файлов - это две разные вещи.
Регулярные выражения используются в командах / функциях для сопоставления с образцом в тексте. Например, в параметре шаблона grep
или на языках программирования.
Глобализация имени файла используется оболочками для сопоставления имен файлов и каталогов с использованием подстановочных знаков. Возможности глобализации зависят от оболочки. Bash, например, поддерживает подстановочные знаки, такие как:
*
соответствует 0 или более символов?
соответствует 1 персонажу[...]
сопоставить символ в указанном наборе
Эти символы могут выглядеть как регулярные выражения, действительно [...]
имеет то же значение в globbing и regex. Но *
а также ?
означают разные вещи в globbing и regex.
В комментарии вы написали:
но какова разница в переводчике * будь то джокер или регулярное выражение? например:
grep a*b a*.txt
?
Легко. Вроде, как бы, что-то вроде.
Прежде всего, оболочка пытается интерпретировать подстановочные знаки, сопоставляя их с именами файлов. Если есть файлы, начинающиеся с "a" и заканчивающиеся на "b", оболочка заменит a*b
с соответствующими именами файлов. То же самое касается a*.txt
, Если нет подходящих имен файлов, оболочка передаст аргументы grep
как они были, в буквальном смысле.
Тем не менее, первый параметр grep
должен быть шаблон. В 99,999% случаев практического использования вы не хотите, чтобы первый параметр интерпретировался оболочкой. Таким образом, наиболее вероятное намерение было следующим:
grep "a*b" a*.txt
Благодаря цитированию a*b
оболочка не будет интерпретировать его, используя глобализацию, а вместо этого передаст его непосредственно grep
, В очереди, grep
будет интерпретировать это как регулярное выражение (по замыслу).
Подводя итог, оболочка интерпретирует командную строку, следуя своему собственному языку глобализации, использующему подстановочные знаки. Команды, программы интерпретируют свои параметры так, как они были разработаны их авторами.
Если имя файла является строкой для вас, вы можете использовать регулярное выражение также для имен файлов. Например: если вы хотите найти имена файлов, соответствующие регулярному выражению, вы можете попробовать:
find ./ -regex '.*[abc][xyz].*'
Команда ищет файлы, в имени которых есть a, b или c, а затем x, y или z. Это только один пример. Есть бесконечные возможности.