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 aFOO
ouBAR
- 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