Como selecionar apenas números de nomes de arquivos no bash usando regex

2

Eu tenho um diretório com arquivos do padrão:

SNAFU12.jpg
SNAFU1.jpg
SNAFU123.jpg

Eu tentei usar este código, mas não produz saída:

 for f in *.jpg; do
   regex="/\d/g"
   file="f:5:6"
   if [[ $file =~ $regex ]]; then
        echo ${BASH_REMATCH[1]}
   fi
 done

Meu resultado esperado deve ser:

12
1
23
    
por sim04ful 18.01.2017 / 04:11

2 respostas

3

Seu padrão Regex não está combinando nada porque está tentando corresponder dois / s, que são o separador de diretório para * nix, e nenhum nome de arquivo conteria isso. Eu estou supondo /.../g vem do seu JavaScript (ou outro) Regex prática, não?

Faça:

for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

bash O Regexp não suporta \d keyword para a classe de caractere [0-9] . Então é melhor usar [0-9] , se você quer depender do seu locale , use a classe de caractere [:digit:] :

for i in *.jpg; do [[ $i =~ ([[:digit:]]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

Exemplo:

$ for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done
123
12
1
    
por 18.01.2017 / 04:17
0

Modificando a saída ls da pasta que contém os arquivos:

ls SNAFU* | sed -e 's/SNAFU\|.jpg//g'
    
por 18.01.2017 / 09:52