Регулярные выражения VS Имя файла globbing

9

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

    
задан Hamza 29.12.2015 в 09:38
источник

2 ответа

13

Регулярные выражения и имя файла globbing - две разные вещи.

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

Имя файла globbing используется оболочками для сопоставления имен файлов и каталогов с помощью подстановочных знаков. Возможности globbing зависят от оболочки. Например, 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 оболочка не будет интерпретировать его с помощью globbing и вместо этого передать его непосредственно в grep . В свою очередь, grep будет интерпретировать это как регулярное выражение (по дизайну).

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

    
ответ дан janos 29.12.2015 в 10:39
4

Если имя файла является для вас строкой, вы можете использовать regex также для имен файлов. Например: если вы хотите найти имена файлов, соответствующие регулярному выражению, вы можете попробовать:

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

Команда ищет файлы с именами a, b или c, за которыми следуют x, y или z. Это всего лишь один пример. Есть бесконечные возможности.

    
ответ дан nobody 29.12.2015 в 09:51