Регулировать expressions VS Filename globbing

I know that Регулярный expressions пахал to be used only with characters and strings, but sometimes I find them in the ямс of поля. My question is: пашите regexes only used with characters or also with filenames?

22
задан 29 December 2015 в 04:09

2 ответа

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

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

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

4
ответ дан 23 November 2019 в 02:45

Регулярные выражения и подстановка имен файлов - две очень разные вещи.

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

Подстановка имен файлов используется оболочками для сопоставления имен файлов и каталогов с использованием подстановочных знаков. Возможности подстановки зависят от оболочки. Bash, например, поддерживает подстановочные знаки, такие как:

  • * соответствует 0 или более символов
  • ? соответствует 1 символу
  • [...] соответствует символу в указанном наборе

Эти подстановочные знаки могут выглядеть аналогично регулярным выражениям, действительно, [...] имеет то же значение в подстановка и регулярное выражение. Но * и ? означают разные вещи в глобализации и регулярном выражении.

В комментарии вы написали:

но как интерпретатор различается *, джокер это или регулярное выражение? например: grep a * b a * .txt ?

Легко. Типа.

Прежде всего, оболочка пытается интерпретировать подстановочные знаки, сопоставляя их с именами файлов. Если есть файлы, начинающиеся с «a» и заканчивающиеся на «b», оболочка заменит a * b соответствующими именами файлов. То же самое для a * .txt . Если совпадающих имен файлов нет, оболочка передаст аргументы в grep , как они были, буквально.

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

grep "a*b" a*.txt

Благодаря цитированию a * b ,оболочка не будет интерпретировать его с помощью подстановки, а вместо этого передаст его напрямую grep . В свою очередь, grep интерпретирует это как регулярное выражение (по замыслу).

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

26
ответ дан 23 November 2019 в 02:45

Другие вопросы по тегам:

Похожие вопросы: