Extraer subcadena usando bash

0

Todas,

Tengo nombres de archivo que siempre estarán en el siguiente formato "rX_Q_Y_filename.mp3" donde X e Y son números (0-9). FYI, X e Y en el nombre del archivo pueden tener 1 o más dígitos

ejemplo "r1234_Q_456789_filename.mp3"

¿Cómo extraigo la parte 'Q_456789 "del nombre del archivo usando el script bash?

smokinguns
fuente
¿Por qué no usar Perl? Es mucho más fácil: $your_string =~ /r.+_(Q_\d+)_filename\.mp3/; print $1;
m0skit0

Respuestas:

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
Gravedad
fuente
2

No estoy seguro de si esto es exactamente lo que buscas, pero:

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

devolverá una lista de Q_ {números}

$ ls r*.mp3
r1234_Q_456789_test.mp3

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

Aquí hay una manera ineficiente de hacerlo 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
fuente
0

Oneliner de Sed:

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

'Q' es el primer personaje que le interesa, así que deseche todo lo que esté delante de él, agrupe el 'Q_number' y luego descarte el resto, sustituya la referencia inversa.

potong
fuente