Лучший способ извлечь подстроку в bash

у меня есть список mp3 файлы с именем so:

$artist/$album ($year)/$tracknum $title.mp3

многие из этих треков имеют неправильные или отсутствующие теги, которые я исправляю с помощью id3v2 и регулярное выражение, потому что имена файлов все правильно. Вот пример того, как я устанавливаю заголовки:

for mp3 in *.mp3; do id3v2 -t "$(echo $mp3 | cut -d. -f1 | cut -d  -f2-)" "$mp3"; done

(Примечание: кавычки есть, потому что названия часто имеют пробелы, что заставляет bash жаловаться, если пробелы не используются)

мой вопрос заключается в следующем: есть ли лучший способ извлечь определенную подстроку из этих файлов? В случае титулов я не могу использовать grep -o без соответствующего $tracknum потому что многие треки имеют цифры и пробелы в названиях (это означает, что мне нужно "([0-9a-zA-Z ]+)" мой рисунок, который совпадает с полным именем перед .mp3).

я почти уверен, что есть гораздо лучший способ сделать это. Есть?

14
задан J David Smith
12.02.2023 18:28 Количество просмотров материала 3575
Распечатать страницу

1 ответ

если вы хотите извлечь название (и, в случае, если это полезно, tracknum), вы должны быть в состоянии сделать это следующим образом:

read -r tracknum title <<<$(basename "$mp3" .mp3)

для других битов я бы начал с разбиения имени файла на / изолировать части. Например:

album_year=$(cut -d/ -f2 <<<"$mp3")
album=${album%\ (*)}
year=${album_year:-5:4}

последний зависит от года и четырех цифр; если это не гарантировано, то вы можете сделать это, используя более неуклюжее выражение:

year=${album_year:$((${#album}+2)):$((${#album_year}-${#album}-3}

кроме того, если вы не знаете как глубоко в пути album_year часть, вы можете извлечь второй последний сегмент (т. е. непосредственный каталог файла) с:

album_year=$(basename "$(dirname "$mp3")")

или можно разделить весь путь на массив:

IFS=/ read -ra segments <<<"$mp3"
album_year=${segments[-2]}
1
отвечен rici 2023-02-14 02:16

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх