Ответы:
Регулярные выражения и глобализация имен файлов - это две разные вещи.
Регулярные выражения используются в командах / функциях для сопоставления с образцом в тексте. Например, в параметре шаблона grep
или в языках программирования.
Глобализация имени файла используется оболочками для сопоставления имен файлов и каталогов с использованием подстановочных знаков. Возможности сглаживания зависят от оболочки. Bash, например, поддерживает подстановочные знаки, такие как:
*
соответствует 0 или более символов?
соответствует 1 символ[...]
сопоставить символ в указанном набореЭти подстановочные знаки могут выглядеть аналогично регулярным выражениям, действительно [...]
имеют то же значение в globbing и regex. Но *
и ?
имеют в виду разные вещи в globbing и regex.
В комментарии вы написали:
но в чем разница переводчика * будь то джокер или регулярное выражение? например:
grep a*b a*.txt
?
Легко. Вроде.
Прежде всего, оболочка пытается интерпретировать подстановочные знаки, сопоставляя их с именами файлов. Если есть файлы, начинающиеся с «а» и заканчивающиеся на «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. Это только один пример. Есть бесконечные возможности.
find ./ -name 'a*'
вы используете * в качестве подстановочного знака. Когда вы печатаете find ./ -regex 'a*'
, вы используете * в регулярном выражении. Важным отличием является переключатель -name
или -regex
.