sed: Nullen an Zahl anfügen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Yadgar
Beiträge: 954
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

sed: Nullen an Zahl anfügen

Beitrag von Yadgar » 11.10.2018 15:51:08

Hi(gh)!

Folgendes Problem: damit Amarok bei einer m3u-Playlist korrekte Gesamtspieldauern anzeigt, muss die Dauer jedes Einzeltitels nach #EXTINF in Millisekunden angegeben werden. Die Playlist-Exportfunktion von Amarok verwendet nur Sekunden, so dass jeweils drei Nullen angefügt werden müssen. Aus

Code: Alles auswählen

#EXTINF:296,Baumann - Strangers In The Night, Long Version
müsste also werden:

Code: Alles auswählen

#EXTINF:296000,Baumann - Strangers In The Night, Long Version
Wenn ich allerdings das sed-Kommando

Code: Alles auswählen

sed -i -e 's/[0-9],/[0-9]000/g' dateiname
verwende, wird nicht die ursprüngliche Einer-Sekundenzahl beibehalten, sondern durch [0-9] ersetzt. Wie mache ich sed klar, dass die Zahl übernommen werden soll?
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Nullen an Zahl anfügen

Beitrag von Meillo » 11.10.2018 16:03:07

Code: Alles auswählen

sed -i -e 's/\([0-9]\),/\1000,/' dateiname
Es ginge aber auch:

Code: Alles auswählen

sed -i 's/,/000,/' dateiname
Use ed once in a while!

Benutzeravatar
Yadgar
Beiträge: 954
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: sed: Nullen an Zahl anfügen

Beitrag von Yadgar » 11.10.2018 16:21:06

Hi(gh)!
Meillo hat geschrieben: ↑ zum Beitrag ↑
11.10.2018 16:03:07

Code: Alles auswählen

sed -i -e 's/\([0-9]\),/\1000,/' dateiname
Was bedeutet '\1' im "Ersetzen"-Teil des s-Kommandos?
(etwas später)
Ah, ich habe es schon herausgefunden: Referenz auf regulären Ausdruck! Müssen reguläre Ausdrücke in sed eigentlich immer geklammert werden?
Meillo hat geschrieben: ↑ zum Beitrag ↑
11.10.2018 16:03:07
Es ginge aber auch:

Code: Alles auswählen

sed -i 's/,/000,/' dateiname
Keine gute Idee, denn in den Playlists kommt das Komma auch mal hinter Buchstaben vor!
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Nullen an Zahl anfügen

Beitrag von Meillo » 11.10.2018 16:46:11

Yadgar hat geschrieben: ↑ zum Beitrag ↑
11.10.2018 16:21:06
Meillo hat geschrieben: ↑ zum Beitrag ↑
11.10.2018 16:03:07
Es ginge aber auch:

Code: Alles auswählen

sed -i 's/,/000,/' dateiname
Keine gute Idee, denn in den Playlists kommt das Komma auch mal hinter Buchstaben vor!
Doch, das ist ist eine gute Idee!

;-)
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13559
Registriert: 09.04.2008 12:48:59

Re: sed: Nullen an Zahl anfügen

Beitrag von hikaru » 11.10.2018 16:47:26

Yadgar hat geschrieben: ↑ zum Beitrag ↑
11.10.2018 16:21:06
Müssen reguläre Ausdrücke in sed eigentlich immer geklammert werden?
Nein. sed arbeitet grundsätzlich auf Regex.
Yadgar hat geschrieben: ↑ zum Beitrag ↑
11.10.2018 16:21:06
Keine gute Idee, denn in den Playlists kommt das Komma auch mal hinter Buchstaben vor!
Und Zahlen! Daher ist es wichtig, dass du hier das sed-Kommando nicht mit g abschließen (wie in deinem Eingangsbeitrag), sonst zerwürgt dir das möglicherweise die Titel. Beispiel: "Megadeath - 1,320"
Du willst hier wirklich nur das erste Auftreten einen Kommas berücksichtigen, denn das ist in einer m3u das hinter der Länge.

Benutzeravatar
Yadgar
Beiträge: 954
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: sed: Nullen an Zahl anfügen

Beitrag von Yadgar » 11.10.2018 17:20:34

Hi(gh)!

Das Skript (zusammen mit weiteren sed-Kommandos) hat exakt einmal funktioniert, beim zweiten Mal bekomme ich wieder Fehlermeldungen, die ich nicht verstehe...

Hier das Skript:

Code: Alles auswählen

sed -i -e 's/%20/ /g' *m3u
sed -i -e 's/%27/\'/g' *m3u
sed -i -e 's/%28/\(/g' *m3u
sed -i -e 's/%29/\)/g' *m3u
sed -i -e 's/%2C/,/g' *m3u
sed -i -e 's/\([0-9]\),/\1000,/' *m3u

und die dazu gehörige Fehlermeldung:

Code: Alles auswählen

/home/yadgar/scripts/m3u: Zeile 6: Dateiende beim Suchen nach `'' erreicht.
/home/yadgar/scripts/m3u: Zeile 7: Syntax Fehler: Unerwartetes Dateiende.
Was soll das?!? Ist das ' in der zweiten Zeile falsch maskiert?
(fünf Minuten später)

Nein, ist es nicht, aber selbst mit einem maskierten ' müssen die Hochkommata am Anfang und Ende der s-Sequenz durch " ersetzt werden:

Code: Alles auswählen

sed -i -e "s/%27/\'/g" *m3u
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Yadgar
Beiträge: 954
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: sed: Nullen an Zahl anfügen

Beitrag von Yadgar » 11.10.2018 18:20:09

Hi(gh)!
Und Zahlen! Daher ist es wichtig, dass du hier das sed-Kommando nicht mit g abschließen (wie in deinem Eingangsbeitrag), sonst zerwürgt dir das möglicherweise die Titel. Beispiel: "Megadeath - 1,320"
Du willst hier wirklich nur das erste Auftreten einen Kommas berücksichtigen, denn das ist in einer m3u das hinter der Länge.
Abgesehen davon, dass die Truppe "Megadeth" (ohne zweites a) heißt (wo ist hier eigentlich der Headbanger-mit-Pommesgabel-Smily?)... du meinst sicherlich "erstes Auftreten pro Zeile", oder?
If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Nullen an Zahl anfügen

Beitrag von Meillo » 11.10.2018 19:16:33

Nachtrag: Dies waere meine praeferierte Loesung:

Code: Alles auswählen

sed -i '/^#EXTINF:/s/,/000,/' dateiname

Zu deinem anderen Problem: Innerhalb von Singlequotes sind Backslashes keine Escape-Zeichen, darum kann man innerhalb von Singlequote-Strings keine Singlequotes aufnehmen. So nimmt man ein Singlequote in einen Singlequote-String auf:

Code: Alles auswählen

echo 'foo'"'"'bar'
Oder so:

Code: Alles auswählen

echo 'foo'\''bar'
Use ed once in a while!

Antworten