Extrair substring usando bash

0

Todos,

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?

smokinguns
fonte
Por que não usar o Perl? É mais fácil: $your_string =~ /r.+_(Q_\d+)_filename\.mp3/; print $1;
m0skit0

Respostas:

2

Para 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
grawity
fonte
2

Não tenho certeza se isso é exatamente o 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
Paul
fonte
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
Jin
fonte
0

Sed um forro:

sed 's/[^Q]*\(Q_[0-9]*\)_.*/\1/' <<<"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.

potong
fonte