Você não precisa de canalização, grep
ou ls
. Basta usar o globo ocular.
Em bash
, usando extglob
pattern (deve ser habilitado por padrão em sessões interativas, se não usar shopt -s extglob
para defini-lo primeiro):
file1@(|?|??)
?
corresponde a qualquer caractere único, @(||)
seleciona qualquer um dos padrões separados por |
.
Se você quisesse apenas combinar os caracteres entre a-z
e A-Z
, use a classe de caractere [:alpha:]
, que denota todos os caracteres alfabéticos na localidade atual:
file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]])
Exemplo:
$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb
$ ls -1 file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]]))
file1
file1a
file1ab
file1Ab
file1as
zsh
suporta isso nativamente:
file1(|[[:alpha:]]|[[:alpha:]][[:alpha:]])
Estou respondendo a essa parte com muita relutância, a pedido do OP.
Qualquer leitor futuro, não analise ls
, use globbing.
Usando ls
e grep
:
ls | grep -E '^file1[[:alpha:]]{,2}$'
Exemplo:
% ls | grep -E '^file1[[:alpha:]]{,2}$'
file1
file1a
file1ab
file1Ab
file1as