#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