Extrair substring usando bash

0

Tudo,

Eu tenho nomes de arquivos que estarão sempre no seguinte formato "rX_Q_Y_filename.mp3" onde X e Y são números (0-9). FYI, X e Y no nome do arquivo podem ter 1 ou mais dígitos

exemplo "r1234_Q_456789_filename.mp3"

Como faço para extrair a parte 'Q_456789 "do nome do arquivo usando o script bash?

    
por smokinguns 07.10.2011 / 07:49

4 respostas

2

Para o bash:

# See "modern regexps" in regex(7) for regexp syntax.

# The intermediate $re variable is not necessary, but it removes the
# need for having to escape every single metacharacter in the regexp.

re='_(Q_[[:digit:]]+)'

if [[ $name =~ $re ]]; then
    part=${BASH_REMATCH[1]}
    echo "Matched on $part"
else
    echo "Match failed"
fi
    
por 07.10.2011 / 08:03
2

Não tenho certeza se é exatamente isso que você procura, mas:

ls -1 r*.mp3 | egrep -o Q_[0-9]+

retornará uma lista de Q_ {numbers}

$ ls r*.mp3
r1234_Q_456789_test.mp3

$ ls -1 r*.mp3 | egrep -o Q_[0-9]+
Q_456789
    
por 07.10.2011 / 07:59
0

Aqui está uma maneira ineficiente de fazer isso com awk .

$ ls -1 *.mp3
r1234_Q_433_filename.mp3
r1234_Q_456789_filename.mp3
r323_Q_433_filename.mp3

$ ls -1 *.mp3 | awk '{print substr($1, match($0, /Q/), (match($0, /\_f/) - match($0, /Q/)))}'
Q_433
Q_456789
Q_433
    
por 07.10.2011 / 08:27
0

Sedelinerante:

sed 's/[^Q]*\(Q_[0-9]*\)_.*//' <<<"r1234_Q_456789_filename.mp3"
Q_456789

'Q' é o primeiro personagem que você está interessado, então jogue fora tudo antes dele, agrupe o 'Q_number' e então destrua o resto, substitua a referência anterior.

    
por 24.10.2011 / 20:54

Tags