Відповіді:
Як щодо:
ls *[!0-9][0-9].txt
На !
початку групи доповнює своє значення.
Як зазначається в коментарях, це робиться баш, спробуйте, наприклад:
printf "%s\n" *[!0-9][0-9].txt
ls
) не підтримує регулярні вирази тут. Це вирази імен файлів (Globbing) . Різницю ви можете побачити вже у своєму прикладі: тут *
є символи підстановки, яких немає в регулярних виразах, де ви б використовували .*
для досягнення того ж. Регулярні вирази набагато потужніші, ніж глобальні.
Запитання запитувало регулярні вирази. Bash, і, отже ls
, не підтримує тут регулярних виразів. Він підтримує вирази імен файлів ( Globbing ), форми підстановок. Регулярні вирази набагато сильніші за це.
Якщо ви дійсно хочете використовувати регулярні вирази, ви можете використовувати find -regex
такий:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Знайти рекурсивно за замовчуванням, але ls
це не так. Щоб знайти лише файли в поточному каталозі, ви можете відключити рекурсію за допомогою -maxdepth 1
. Знайдіть збіги проти імені файлу з контуром, тому імена файлів починаються з того, що ./
ви запускаєте знаходження в .
. Регекс починається з того, \./
щоб впоратися з цим. Зауважте, що в регулярному виразі .
- це спеціальний символ, що відповідає будь-якому символу, але тут ми дійсно хочемо крапки, тому ми уникаємо його за допомогою косої риски. Ми робимо те ж саме для крапки .txt
, оскільки в іншому випадку регулярний вираз також збігається Atxt
. Цифрові класи такі ж, як і для глобусу, лише те, що вам потрібно ^
замість !
інвертувати клас символів.
Якщо ви хочете отримати вихід ls
, ви можете використовувати -exec ls
так:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
підтримує пару різних ароматів регексу. Ви можете вказати -regextype
, наприклад:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Для мене можливі типи: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extension', 'posix-minimal-basic', 'sed' Ви можете запустити, find -regextype help
щоб дізнатися, що підтримується у вашій системі.
З ksh розширеними глобусами (або bash -O extglob
або zsh -o kshglob
), які ви вже використовуєте, це було б:
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
Або
ls -d -- !(*[[:digit:]])[[:digit:]].txt
Якщо ви хочете , щоб відповідати на a1.txt
і2.txt
, але не a12.txt
ні 12.txt
.
Однак зауважте, що в ksh та bash (якщо ви не встановите failglob
можливість отримати поведінку, схожу на zsh), якщо цей шаблон не відповідає жодному файлу, шаблон буде переданий буквально ls
, і якщо цей (дивним чином названий) файл трапиться існує, він буде перерахований, ls
навіть якщо він не відповідає самому шаблону.
Щоб включити .2.txt
, встановіть dotglob
параметр в bash
, додайте (D)
Глоби класифікатор в zsh
або набір FIGNORE
для !(.|..)
в ksh93
.
shopt -s extglob
.