За исключением ksh93
, ни одна из обычных оболочек не имеет регулярных выражений с таким же синтаксисом, как sed, awk и т.д., которые можно использовать для поиска файлов.
Ksh93, bash и zsh имеют регулярные выражения с другим синтаксисом, обратно совместимым с globs:
?
соответствует любому одиночному символу (как .
в обычном синтаксисе regexp)[...]
соответствует набору символов в основном таким же образом*(FOO)
соответствует любому количеству вхождений FOO
(например. (FOO)*
в обычном синтаксисе regexp)+(FOO)
соответствует одному или более вхождений, и ? (FOO)
соответствует нулю или одному вхождению@(FOO|BAR)
соответствует либо FOO
либо BAR
*
в начале и в концеЭтот синтаксис нужно активировать с помощью shopt -s extglob
в bash и с помощью setopt ksh_glob
в zsh. Поэтому в bash вы напишете
shopt -s extglob
ls a*(k)
См. также Почему мое регулярное выражение работает в X, но не в Y?
Кш93, zsh и bash могут выполнять сопоставление регулярных выражений с расширенными регулярными выражениями (в основном синтаксис awk) для строк, с помощью оператора =~
конструкции [[ ... ]]
. Это не очень удобно для листинга файлов, но если очень хочется, то это можно сделать.
shopt -s dotglob # <<< include dot files, for bash
setopt globdots # <<< include dot files, for zsh
FIGNORE='@(.|..)' # <<< include dot files, for ksh
for x in *; do
if [[ $x =~ ^ak*$ ]]; then
…
fi
done