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