Combine cada caractere em uma combinação de caracteres, mais o próprio valor da combinação, no Bash

1

Ao praticar o regex no Bash, tentei corresponder o conjunto / padrão de pesquisa entre os 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 corresponde:

a.c
a.h
a.o 

mas não corresponde ao conjunto inteiro como em a.cho .

Por que eu não correspondi o conjunto inteiro também e como é possível fazer isso?

    
por user9303970 24.04.2018 / 17:01

2 respostas

3

Você não está usando expressões regulares aqui, mas padrões de globalização de nomes de arquivo.

O [...] sempre corresponderá a um único caractere (isso é o mesmo entre os padrões de globalização de nomes de arquivos e expressões regulares), e é por isso que ele não corresponde aos três caracteres cho ( [cho] significa "um de c , h e o ").

Para corresponder a todos os nomes que começam com a. use a.* .

Para corresponder todos os nomes que começam com a. e, em seguida, terminam diretamente em c , h , o ou cho , defina primeiro a opção extglob shell com shopt -s extglob e use% código%.

Uma expansão de chave como a.@([cho]|cho) geraria os nomes de arquivos na linha de comando, mas não garante que esses arquivos realmente existam.

    
por 24.04.2018 / 17:05
1

Você pode usar o Expansão de órtese do bash, que não é um padrão, mas uma lista de strings

ls *.{c,h,o,cho}

O shell expande que antes o comando ls é executado para

ls *.c *.h *.o *.cho

Como a expansão da chave ocorre antes da expansão do nome do arquivo, podemos colocar o padrão glob dentro das chaves

ls *.{[cho],cho}
    
por 24.04.2018 / 17:17