Используя 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 состоит из частей:
(.*[^[:space:]]) захватывает название дорожки. Поскольку это регулярное выражение окружено паренами, название дорожки сохраняется в группе. Часть .* Соответствует чему угодно. [^[:space:]] соответствует любому непробельному пространству . Поместив [^[:space:]] в конце, мы убедились, что это захватывает название дорожки, но не пробел после нее.
[[:space:]]*[[] соответствует пробелам, если таковые имеются, которые следуют за именем дорожки и [ них. Поскольку [ является активным персонажем, мы должны каким-то образом избежать этого. Здесь мы избегаем этого, помещая его в квадратные скобки как [[] .
(.*)[]] сопоставляет текст до последнего ] в имени файла. Парены здесь приводят к тому, что имя исполнителя записывается как вторая группа.
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 которая несовместима и не будет работать, как указано выше.