Exceto pelo ksh93 , nenhum dos shells usuais tem expressões regulares com a mesma sintaxe de sed, awk, etc. que podem ser usados para arquivos correspondentes.
Ksh93, bash e zsh têm expressões regulares com uma sintaxe diferente, compatível com globs:
-
?corresponde a qualquer caractere único (como.na sintaxe usual de regexp) -
[…]corresponde a um conjunto de caracteres basicamente da mesma maneira -
*(FOO)corresponde a qualquer número de ocorrências deFOO(como(FOO)*na sintaxe usual de regexp) - similarmente
+(FOO)corresponde a uma ou mais ocorrências e?(FOO)corresponde a zero ou uma ocorrência -
@(FOO|BAR)corresponde aFOOouBAR - As correspondências aplicam-se a toda a cadeia, não a uma substring; se você quiser uma substring, coloque
*no começo e no final
Essa sintaxe precisa ser ativada com shopt -s extglob no bash e com setopt ksh_glob no zsh. Então no bash você escreveria
shopt -s extglob
ls a*(k)
Veja também minha expressão regular funciona em X, mas não em Y?
Ksh93, zsh e bash podem fazer correspondência de expressões regulares com expressões regulares estendidas (basicamente a sintaxe do awk) em strings, com o operador =~ da construção [[ … ]] . Isso não é conveniente para listar arquivos, mas se você realmente quiser, isso pode ser feito.
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