Все,

У меня есть имена файлов, которые всегда будут в следующем формате "rX_Q_Y_filename.mp3", где X и Y являются числами (0-9). К вашему сведению, X и Y в имени файла могут состоять из 1 или более цифр

пример "r1234_Q_456789_filename.mp3"

Как извлечь часть имени файла «Q_456789», используя скрипт bash?

4 ответа4

2

Я не уверен, что это именно то, что вам нужно, но:

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

вернет список Q_ {numbers}

$ ls r*.mp3
r1234_Q_456789_test.mp3

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

Для Баш:

# 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
0

Sed oneliner:

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

«Q» - первый символ, который вас интересует, поэтому отбросьте все перед ним, сгруппируйте «Q_number», а затем отбросьте остальные, подставьте обратную ссылку.

0

Вот неэффективный способ сделать это с помощью 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .