Nome do arquivo Regex com vários dígitos

4

Digamos que eu tenha o seguinte arquivo:

test_file-1234-master.tar.gz

Eu tentei un tar usando os seguintes comandos

 tar -xf test_file-[0-9]+-master.tar.gz
 tar -xf test_file-[:digit]-master.tar.gz

Mas sem sorte. Como combinar este padrão?

NOTA: Haverá sempre um arquivo. Eu não estou tentando abrir vários arquivos.

    
por shiva 06.10.2015 / 08:51

2 respostas

4

Com ksh , bash -O extglob e zsh -o kshglob apenas:

test_file-+([[:digit:]])-master.tar.gz

Em bash , você precisa definir o extglob opção primeiro. Esse +(...) corresponde a uma ou mais ocorrências dos padrões fornecidos. [:digit:] quando dentro de uma expressão de parêntese [...] é um POSIX definido classe de caracteres que inclui dígitos decimais indo-arábicos ( [[:digit:]] é o mesmo que [0123456789] ou [0-9] ).

Ele corresponderá:

test_file-1234-master.tar.gz
test_file-1-master.tar.gz
test_file-123456789-master.tar.gz

Não será não compatível:

test_file-1b-master.tar.gz
test_file--master.tar.gz
test_file-a1-master.tar.gz
test_file-abcd-master.tar.gz
test_file-Ⅵ-master.tar.gz # roman numeral
test_file-٨-master.tar.gz  # Eastern Arabic decimal digit

O comando tar na sua pergunta deve ser feito assim (com um loop):

shopt -s extglob # bash
# setopt kshglob # zsh
for f in test_file-+([[:digit:]])-master.tar.gz; do
    tar xf "$f"
done

A sintaxe curta mais idiomática em zsh é:

setopt extendedglob
for f (test_file-[0-9]##-master.tar.gz) tar xf $f

( # sendo o equivalente a extensão estendida de regexp * e ## ou + ).

    
por 06.10.2015 / 09:19
3

Você está tentando usar metacaracteres de expressões regulares estendidas e classes de caracteres POSIX ( + e [:digit:] respectivamente) em um padrão globbing;

Supondo que bash ou globalização "básica" semelhante só ofereça um conjunto de curingas como:

  • ? : único elemento
  • * : zero ou mais caracteres
  • [] : classe de caractere
  • {} : list
  • [!] : classe de caractere negada

Diferentemente dos metacaracteres em expressões regulares estendidas, na globalização "básica" não há como modificar o comportamento de um curinga para corresponder a um número fixo de ocorrências;

Então, usando globbing "básico", o padrão mais curto e mais estreito seria:

tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz
    
por 06.10.2015 / 09:12