У меня есть несколько музыкальных файлов с названием «track track [artist]».

Я хочу, чтобы они были «[artist] trackname», и поэтому мне нужно переместить квадратные скобки и то, что в них, в начало файла.

Я только что обнаружил sed, но у меня нет мозгов, чтобы понять, как использовать его, чтобы делать то, что я хочу.

1 ответ1

0

Используя sed

Есть много способов сделать это. Если вы хотите сделать это во время изучения sed , попробуйте:

$ filename='track name [artist].mp3'
$ newname=$(echo "$filename" | sed -E 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[\2] \1/')
$ echo "$newname"
[artist] track name.mp3

Команда sed substitution имеет вид s/old/new/ где old - это регулярное выражение. В этом случае old состоит из частей:

  1. (.*[^[:space:]]) захватывает название дорожки. Поскольку это регулярное выражение окружено паренами, название дорожки сохраняется в группе. Часть .* Соответствует чему угодно. [^[:space:]] соответствует любому непробельному пространству . Поместив [^[:space:]] в конце, мы убедились, что это захватывает название дорожки, но не пробел после нее.

  2. [[:space:]]*[[] соответствует пробелам, если таковые имеются, которые следуют за именем дорожки и [ них. Поскольку [ является активным персонажем, мы должны каким-то образом избежать этого. Здесь мы избегаем этого, помещая его в квадратные скобки как [[] .

  3. (.*)[]] сопоставляет текст до последнего ] в имени файла. Парены здесь приводят к тому, что имя исполнителя записывается как вторая группа.

new часть команды подстановки - [\2] \1 . Это ставит вторую группу \2 (имя исполнителя) первой, а первую группу \1 (название композиции) - второй.

Ярлык для переименования файлов

Если ваша цель - переименовать файлы, я бы порекомендовал команду rename из пакета perl (иногда называемого prename):

$ ls *mp3
track name [artist].mp3
$ prename 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[$2] $1/' *.mp3
$ ls *mp3
[artist] track name.mp3

prename использует команду подстановки perl, которая очень похожа на команду sed, но ссылается на захваченные группы не как \1 и \2 а как $1 и $2 .

ПРИМЕЧАНИЕ. Некоторые linux устанавливают другую утилиту rename которая несовместима и не будет работать, как указано выше.

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