Ao praticar regex no Bash, tentei combinar todo o conjunto/padrão de pesquisa dentro dos colchetes.
Em vez disso, combinei apenas cada caractere neles.
Por exemplo, com
cd
touch a.c a.h a.o a.cho
ls *.[cho]
O ls
combinado:
a.c
a.h
a.o
mas não correspondeu ao conjunto inteiro como em a.cho
.
Por que não combinei todo o conjunto também e como é possível fazer isso?
Você não está usando expressões regulares aqui, mas padrões de globbing de nome de arquivo.
O
[...]
sempre corresponderá apenas a um único caractere (isso é o mesmo entre padrões de globbing de nome de arquivo e expressões regulares), e é por isso que ele não corresponde aos três caracterescho
([cho]
significa "um dec
eh
"o
).Para corresponder a todos os nomes que começam com
a.
usea.*
.Para corresponder a todos os nomes que começam com
a.
e depois terminam em , ouc
, primeiro defina a opção shell com e use .h
o
cho
extglob
shopt -s extglob
a.@([cho]|cho)
Uma expansão de colchetes como
a.{c,h,o,cho}
geraria os nomes de arquivo na linha de comando, mas não garante que esses arquivos realmente existam.Você pode usar o bash Brace Expansion , que não é um padrão, mas uma lista de strings
O shell expande antes que o comando ls seja executado para
Como a expansão de chaves ocorre antes da expansão do nome do arquivo, podemos colocar o padrão glob dentro das chaves