кванторы регулярных выражений в bash — простое и расширенное сопоставление {n} раз

#regex #bash #filenames #quantifiers

#регулярное выражение #bash #имена файлов #кванторы

Вопрос:

Я использую оболочку bash и пытаюсь перечислить файлы в каталоге, имена которых соответствуют шаблонам регулярных выражений. Некоторые из этих шаблонов работают, а другие — нет. Например, подстановочный знак * подходит:

 $ls FILE_*
FILE_123.txt    FILE_2345.txt   FILE_789.txt
  

И шаблон диапазона фиксирует первые два из них следующим образом:

 $ls FILE_[1-3]*.txt
FILE_123.txt    FILE_2345.txt
  

но не имя файла с символом «7» после «FILE_», как ожидалось. Отлично. Но теперь я хочу посчитать цифры:

 $ls FILE_[0-9]{3}.txt 
ls: FILE_[0-9]{3}.txt: No such file or directory
  

Разве это не должно давать мне имена файлов с тремя последующими числовыми цифрами "FILE_" (т.Е. FILE_123.txt И FILE_789.txt , Но не FILE_2345.txt ). Может кто-нибудь сказать мне, как я должен использовать квантификатор {n} (т. Е. «сопоставить этот шаблон n раз)?

Комментарии:

1. Кстати.: регулярное выражение ! = глобализация

2. Используя шаблоны глобуса оболочки, вам нужно будет написать FILE_[0-9][0-9][0-9].txt

Ответ №1:

ls использует с glob pattern , вы не можете использовать {3} . Вы должны использовать FILE_[0-9][0-9][0-9].txt . Или вы могли бы выполнить следующую команду.

 ls | grep -E "FILE_[0-9]{3}.txt"
  

Редактировать:

Или вы также используете find command .

 find . -regextype egrep -regex '.*/FILE_[0-9]{3}.txt'
  

.*/ Префикс необходим для сопоставления полного пути. В Mac OS X :

 find -E . -regex ".*/FILE_[0-9]{3}.txt"
  

Комментарии:

1. Если это может быть полезно в этом случае или для кого-либо еще, кто столкнется с этим вопросом в будущем, find -regextype gnu-awk -regex ./FILE_[0-9]{3}.txt также достигнет того же результата.

Ответ №2:

Расширение имени файла Bash не использует регулярные выражения. Он использует сопоставление с шаблоном глобуса, что явно отличается, и то, что вы пытаетесь FILE_[0-9]{3}.txt использовать, заключается в расширении фигурных скобок, за которым следует расширение имени файла. bash Расширенная функция масштабирования Even не имеет эквивалента регулярным выражениям {N} , поэтому, как уже упоминалось, вы должны использовать FILE_[0-9][0-9][0-9].txt