Por que meu regex não funciona no bash “if”? [duplicado]

1

Aqui está o meu código:

if [ -f /Applications/xml[0-9].pl ]

Eu também tentei com -f =~ e colchetes duplos, mas nenhum parece funcionar.

Eu primeiro que o regex pode estar com defeito, mas eu tentei isso.

echo h1 | sed 's/h[0-9]/h/'

E isso funcionou. O que estou fazendo errado aqui?

    
por DisplayName 01.12.2014 / 14:55

2 respostas

3

Você não pode testar um arquivo com um regex nem com um glob assim. Você precisa fazer uma iteração nos arquivos:

for file in /Applications/xml[0-9].pl; do if [ -f "$file" ]; then ...
    
por 01.12.2014 / 15:03
1

o bash expande a expressão regular antes de avaliar a condição. Se o seu diretório tiver três arquivos pelo nome

/Applications/xml0.pl
/Applications/xml1.pl
/Applications/xml2.pl

sua declaração if parece ser shell como

if [ -f /Applications/xml0.pl /Applications/xml1.pl /Applications/xml2.pl ]]

que está sintaticamente incorreto. Você precisará especificar o nome do arquivo completamente quando quiser procurar por sua existência usando

for file in /Applications/xml[0-9].pl
do
    if [ -f ${file} ]

ou, se puder, use o comando find para fazer o que quiser com o arquivo.

    
por 01.12.2014 / 15:14