LINUX.ORG.RU

Помогите мне совладать с sed, а может мне нужен не он?

 


2

1

Есть файл плэйлиста - допустим untitled.pls

Содержимое, что-то вроде такого:

[playlist]
NumberOfEntries=13
File1=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/01 CHOOGA - I Remember All.mp3
File2=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/02 Susanin - Rain.mp3
File3=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/03 Seldome - Matvey.mp3
File4=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/04 U-dahn - Cray.mp3
File5=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/05 DJ DED - Autumn is Back.mp3
File6=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/06 N-box - Beautiful Moments.mp3
File7=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/07 Celestial Spirit - Mescalito.mp3
File8=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/08 DJ DED - Just Funk.mp3
File9=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/09 Smoki Jay - Blueberry.mp3
File10=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/10 Seldome - Mies.N.mp3
File11=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/11 PIANOCHOCOLATE - Not Too Late.mp3
File12=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/12 Peter Zanegin - Sun Force.mp3
File13=/media/D/music/Tunguska/VA - Tunguska Electronic Music Society - Siberian Jungle vol.2 - 2011/13 N-box - Fallen Angel.mp3

Мне хочется получать на выходе только названия треков, в таком виде:

01 CHOOGA - I Remember All
02 Susanin - Rain
03 Seldome - Matvey
04 U-dahn - Cray
05 DJ DED - Autumn is Back
06 N-box - Beautiful Moments
07 Celestial Spirit - Mescalito
08 DJ DED - Just Funk
09 Smoki Jay - Blueberry
10 Seldome - Mies.N
11 PIANOCHOCOLATE - Not Too Late
12 Peter Zanegin - Sun Force
13 N-box - Fallen Angel

Погуглив пришёл к такому:

cat untitled.pls | cut -c 65-
Удаляются первые 65 символов до названий треков. Это уже хорошо. Но блин! Если я захочу проделать это с другим плэйлистом, там придёться опять подбирать сколько символов удалить в начале, т.к. изменится название папки и т.д. Здесь явно нужно что-то по круче, чем просто cut.

Погуглил примеры с sed. Ничего не нашёл сложнее, как удалить пробелы, поставить пробелы, удалить строку и т.д. Здесь явно нужны регулярные выражения(ох и не дружу я с ними, на википедии всё понятно, но как берусь за них - затык), либо ещё можно как-то удалять символы до последнего знака «/» в строке и потом ещё ".mp3" в конце. Мне ничего особенного ненужно, только вывести в консоли только названия треков(без расширения .mp3, .wav и т.д.) из файла плэйлиста.

Да, вам sed не нужен.

#!/bin/bash

while IFS='=' read -r key file; do
    [[ $key == File* ]] || continue
    basename="${file##*/}"
    printf '%s\n' "${basename%.*}"
done

Не проверял.

UPD: А! вам еще и суффикс надо отрезать.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
sed -n -e 's/\.mp3$//' -e 's/\.wav$//' -e 's|.*/\([^/]*$\)|\1|p'
mky ★★★★★
()
Ответ на: комментарий от urquan

А не, извините, я не туда посмотрел. У вас другая проблема — вы нефайловые строки не отфильтровываете.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Зачем тут разделять что-то по пути файла, если вся значимая информация (и название трека и исполнителя) содержится в имени _файла_?

P.S. через $NF было бы робастнее.

good_riddance
()
Ответ на: комментарий от good_riddance

Зачем тут разделять что-то по пути файла, если вся значимая информация (и название трека и исполнителя) содержится в имени _файла_?

Пардон, не разобрал, что вы сейчас написали; вы, вероятно, где-то описались.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
awk -F '/' 'NF > 1 { sub(/\.mp3$/, "", $NF) ; print($NF) }' < untitled.pls

Хотя на самом деле единственно верным решением было бы чтение данных из MP3-тегов.

dexpl ★★★★★
()

Ну и то же самое, но без регулярных выражений и на лиспе ;-)

picolisp -'while (from "File") (prinl (car (split (stem (line) "/" ) ".")))' -bye < untitled.pls
anonymous
()

Всем спасибо за помощь! Много различных вариантов показали. Буду пробовать.

loopergood
() автор топика
Ответ на: комментарий от urquan

Гуд. Расширения файлов бы ещё обрезались на конце.

loopergood
() автор топика
Ответ на: комментарий от anonymous

Лиспа у меня нет) Хотелось бы стандартными средствами системы ;) Но все равно спасибо. Может кому-то будет полезно.

loopergood
() автор топика

Как у вас тут всё сложно.

sed -r  's|.*/(.*)\..*|\1|'  playlist.pls
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.