Используя 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 которая несовместима и не будет работать, как указано выше.