Sed-Einzeiler zur Bearbeitung von Streamdatei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Meillo
Moderator
Beiträge: 9232
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 11:12:13

heisenberg hat geschrieben:Einen hätte ich noch:

Code: Alles auswählen

awk '{getline b;print b"\n"$0}'
Und so, wenn man das gleich an die neuesten Anforderungen anpasst:

Code: Alles auswählen

awk '{getline b;print b": "$0}'
Use ed once in a while!

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 09.01.2017 11:14:09

einfach toll dieses Forum! :THX:
@meillo
Eigentlich hätte ich dir schreiben sollen, dass du mir dafür gleich einen Sedscript verfassen sollst, welches für mich von einen Website die aktuellen .m3u-Dateien runterlädt und diese mittels sed für die Settings meiner enigma2 Box umwandelt, aber das lass ich mal :wink:
@meillo immer zur Stelle, wo man seine Unterstützung braucht,nochmals vielen herzlichen Dank.
Man lernt nie aus,selbst mit 50+ :D Ich sitze stundenlang vorm PC,mir raucht manchmal der Kopf, um eine Aufgabe mit sed usw. zu lösen.Bis man dann auf eine einfache Lösung kommt :idea:
@all
Danke.
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 11:15:56

Meillo hat geschrieben:

Code: Alles auswählen

sed -n 'h;n;G;s/\n/: /;p'
Den letzten Strichpunkt kann man sich uebrigens noch sparen:

Code: Alles auswählen

sed -n 'h;n;G;s/\n/: /p'
Use ed once in a while!

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 11:17:11

tHoRax hat geschrieben:einfach toll dieses Forum! :THX:
Das finde ich auch. Diese Aufgabe hat mir viel Vergnuegen bereitet. :THX:
Use ed once in a while!

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 09.01.2017 11:31:38

@meillo
Doch noch zu früh gefreut :x
Die obere Zeile sollte bestehen bleiben und nur der jeweilige Sendername, welches in der oberen Zeile steht einfach am Ende der nächsten Zeilen mit ":" eingefügt werden.Es war mein Fehler. Die obere Zeile muss immer bleiben.

Code: Alles auswählen

#DESCRIPTION NATIONAL GEOGRAPHIC CHANNEL
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a//xxxx.ts:NATIONAL GEOGRAPHIC CHANNEL
#DESCRIPTION NAT GEO WILD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a//xxxx.ts:NAT GEO WILD
Sollte so formatiert werden.
Erst die Zeile mit #DESCRIPTION NATIONAL GEOGRAPHIC CHANNEL, nur die darauffolgende Zeile erhält den Sendernamen am Ende mit ":" dazu.
Dein Ansatz hat die erste Zeile immer gelöscht,welches mein Fehler war.
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 11:47:04

Es ist etwas muehsam staendig mit Pseudo-Daten arbeiten zu muessen, weil man nie weiss was nun anonymisiert ist, was Fixtext ist, was Fuelltext ist, ob das Beispiel vereinfacht ist, etc. Besser du lieferst deine realen Daten und anonymisierst ggf. den variablen Text zeichenklassenerhaltend (z.B. jeden Kleinbuchstaben zu `a', Jeden Grossbuchstaben zu `A', jede Zahl zu `0', den Rest lassen).

Hier mein Vorschlag (basierend auf meiner Vermutung was die Ausgangsdaten sind):

Code: Alles auswählen

sed 'h;n;G;s/\n#DESCRIPTION /:/'
Use ed once in a while!

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 09.01.2017 12:11:12

hallo meillo.

Code: Alles auswählen

#DESCRIPTION DE | a.tv uuu
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://url/1430.ts
#DESCRIPTION DE | KiKA uuu
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iurl1429.ts
#DESCRIPTION DE | Pro7 MAXX / ProSiebenSat.1 uuu
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://url/1506.ts
#DESCRIPTION DE | Pro7
Soweit bin ich jetzt schon, nur muss noch der jeweilige Sendername in der "#DESCRIPTION DE | " - Zeile unten am Ende der zugehörigen "#SERVICE" - Zeile mit "." eingefügt werden.
Eine #DESCRIPTION- und eine #SERVICE-Zeile gehören jeweils zueinander,von oben nach unten der Datei.

Jetzt muss ich aber zur Arbeit,danke meillo :wink: :D
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 12:48:27

Danke fuer die Ausgangsdaten.
tHoRax hat geschrieben: Soweit bin ich jetzt schon, nur muss noch der jeweilige Sendername in der "#DESCRIPTION DE | " - Zeile unten am Ende der zugehörigen "#SERVICE" - Zeile mit "." eingefügt werden.
Das erledigt mein Befehl vom letzten Post, ich musste nur noch den Fixtext von #DESCRIPTION im s-Kommando den geaenderten Anforderungen ;-) anpassen, siehe:

Code: Alles auswählen

:-L sed 'h;n;G;s/\n#DESCRIPTION DE | /:/' <<!
> #DESCRIPTION DE | a.tv uuu
> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://url/1430.ts
> #DESCRIPTION DE | KiKA uuu
> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iurl1429.ts
> #DESCRIPTION DE | Pro7 MAXX / ProSiebenSat.1 uuu
> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://url/1506.ts
> #DESCRIPTION DE | Pro7
> !
#DESCRIPTION DE | a.tv uuu
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://url/1430.ts:a.tv uuu
#DESCRIPTION DE | KiKA uuu
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iurl1429.ts:KiKA uuu
#DESCRIPTION DE | Pro7 MAXX / ProSiebenSat.1 uuu
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://url/1506.ts:Pro7 MAXX / ProSiebenSat.1 uuu
#DESCRIPTION DE | Pro7
Use ed once in a while!

FragDenPinguin
Beiträge: 34
Registriert: 06.01.2017 05:41:47

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von FragDenPinguin » 09.01.2017 14:11:57

Ich finde den Thread auch 'nice', denn dank Meillos Post :THX: habe ich endlich ungefähr kapiert, was das "kryptische Zeug" ala

Code: Alles auswählen

sed -n 'h;n;G;p'
zu bedeuten hat. Der Unterschied von 'g' und 'G' ist z.B., dass 'G' das Gespeicherte am Ende der aktuellen Zeile einfügt, während 'g' die aktuelle Zeile mit dem Gespeicherten überschreibt. Eigentlich ja recht einfach. Das wird sicherlich noch einmal nützlich sein.

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 10.01.2017 00:29:50

@meillo.

Die ursprüngliche Datei(*m3u), welche ich aus dem Netz runterlade hat etwa folgendes Format:

Code: Alles auswählen

altes  Format(ursprüngliches .m3u-Format	      Umwandlungsformat

#EXTINF:-1,DE-NICK_JR				                -> #DESCRIPTION NICK_JR		   
http://iptv.abcde.df:8000/live/Znvc/Znvc/1234.ts    -> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/1234.ts:NICK_JR
#EXTINF:-1,DE-Disney_Channel_HD                        -> #DESCRIPTION Disney_Channel_HD
http://iptv.abcde.df:8000/live/Znvc/Znvc/2343.ts    -> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2343.ts:Disney Channel_HD
#EXTINF:-1,DE-Disney_XD				        -> #DESCRIPTION Disney_XD
http://iptv.abcde.df:8000/live/Znvc/Znvc/2341.ts    -> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2341.ts:Disney_XD
#EXTINF:-1,DE-Disney_Junior                                  -> #DESCRIPTION Disney_Junior
http://iptv.abcde.df:8000/live/Znvc/Znvc/3244.ts     ->#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/3244.ts:Disney_Junior
#EXTINF:-1,DE-Kika_HD                                          -> #DESCRIPTION Kika_HD
http://iptv.abcde.df:8000/live/Znvc/Znvc/962.ts      -> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/962.ts:Kika_HD
#EXTINF:-1,DE-Disney_Cinemagic			        -> #DESCRIPTION Disney_Cinemagic
http://iptv.abcde.df:8000/live/Znvc/Znvc/976.ts      -> #SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/976.ts:Disney_Cinemagic
Wie gesagt;die letzten Tage saß ich zuviel vorm PC und konnte meine Gedanken nicht so richtig sammeln.
Die daten auf der linken Seite varieren sich manchmal an [],(),[AVCSF], usw. nach #EXTINF:-1,-Zeilen, aber da reicht mir nur der Sendername wie auf der rechten Seite beschrieben.
Ich hoffe, dass ich diesmal mein Problemchen besser darstellen konnte.
Ich bin wirklich nach so vielen Experimentiertagen über viele Stunden ziemlich angeschlagen.

Die Darstellung im Codefenster ist mir nicht besonders gelungen, aber die URL's auf der rechten Seite sollten auf die rechte Seite und nicht runter auf der linken Seite weitergeführt werden.
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

FragDenPinguin
Beiträge: 34
Registriert: 06.01.2017 05:41:47

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von FragDenPinguin » 10.01.2017 01:41:06

Ich versuche es auch noch einmal, wenn es gestattet ist, weil ich diese Anwendung von sed schon recht spannend finde:

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /'
ersetzt #ENTINF:-1,DE- durch #DESCRIPTION. Das reicht schon, um die erste gewünschte Zeile zu fabrizieren - also gebe ich das Ganze aus:

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /;p'
Nun will ich den Sendernamen alleine abspeichern, also lösche ich #DESCRIPTION nach der erfolgreichen Ausgabe der Zeile wieder und vertausche (x) den 'hold space' und den 'pattern space'. Der 'hold space' ist quasi die Zwischenablage, in die auch mit 'h' Zeilen zwischengespeichert werden können. Dann habe ich also den Sendernamen im 'hold space'. (Der 'pattern space' ist die Zeile, die letztendlich mit dem print-Kommando (p) ausgegeben wird). Danach gehts weiter zur nächsten Zeile (n).

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /;p;s/#DESCRIPTION//;x;n'
In dieser Zeile angekommen ersetze ich nun "http://" durch "#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://":

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /;p;s/#DESCRIPTION//;x;n;s/http\:\/\//#SERVICE 4097\:0\:1\:0\:0\:0\:0\:0\:0\:0\:http%3a\:\/\//'
Nun muss noch der Doppelpunkt ans Zeilenende - dazu ersetze (s) ich das Zeilenende ("$") durch ":".
Schlussendlich hole ich den Sendernamen wieder aus dem Holdspace und gebe das Ganze aus - sollte fertig sein.

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /;p;s/#DESCRIPTION//;x;n;s/http\:\/\//#SERVICE 4097\:0\:1\:0\:0\:0\:0\:0\:0\:0\:http%3a\:\/\//;s/$/:/;G;p'
Auf die Daten angewendet ergibt sich:

Code: Alles auswählen

 #DESCRIPTION NICK_JR         
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/1234.ts:
 NICK_JR         
#DESCRIPTION Disney_Channel_HD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2343.ts:
 Disney_Channel_HD
#DESCRIPTION Disney_XD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2341.ts:
 Disney_XD
#DESCRIPTION Disney_Junior
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/3244.ts:
 Disney_Junior
#DESCRIPTION Kika_HD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/962.ts:
 Kika_HD
#DESCRIPTION Disney_Cinemagic
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/976.ts:
 Disney_Cinemagic
Doch noch nicht so ganz ... Was ist falsch gelaufen?

Anscheinend habe ich das Leerzeichen vor dem Sendernamen stehenlassen (schnell gefixt) und da ist noch ein Newline drin. Also vielleicht doch lieber erst den Sendernamen aus dem Holdspace anhängen und dann das Newline durch den Doppelpunkt ersetzen, wie von Meillo vorgeschlagen:

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /;p;s/#DESCRIPTION //;x;n;s/http\:\/\//#SERVICE 4097\:0\:1\:0\:0\:0\:0\:0\:0\:0\:http%3a\:\/\//;G;s/\n/\:/;p'

Code: Alles auswählen

#DESCRIPTION NICK_JR         
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/1234.ts:NICK_JR         
#DESCRIPTION Disney_Channel_HD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2343.ts:Disney_Channel_HD
#DESCRIPTION Disney_XD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2341.ts:Disney_XD
#DESCRIPTION Disney_Junior
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/3244.ts:Disney_Junior
#DESCRIPTION Kika_HD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/962.ts:Kika_HD
#DESCRIPTION Disney_Cinemagic
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/976.ts:Disney_Cinemagic
Vielleicht solltest du noch spezifischer angeben, was außer dem Sendernamen im jetzigen Zustand des Projekts noch alles in der #EXTINF-Zeile auftauchen kann, ([], [AGGDS] usw.) und wo da der Sendernamen steht, damit die Lösung auch solche Fälle erschlägt.

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 10.01.2017 07:06:31

tHoRax hat geschrieben: Die ursprüngliche Datei(*m3u), welche ich aus dem Netz runterlade hat etwa folgendes Format:
[...]

Die Darstellung im Codefenster ist mir nicht besonders gelungen, aber die URL's auf der rechten Seite sollten auf die rechte Seite und nicht runter auf der linken Seite weitergeführt werden.
Bitte kein solcher Mischmasch, sondern einmal die Ausgangsdaten wie sie sind und einmal die Zieldaten wie sie sein sollen, jeweils separat. Denn dann kann ich die Ausgangsdaten in eine Datei kopieren und die Zieldaten in eine andere, und dann an einem Script arbeiten, das mit den Ausgangsdaten ein Ergebnis erzeugt, das ich automatisiert mit diff(1) gegen die Zieldaten abgleichen kann. Das ist die mit Abstand sinnvollste Herangehensweise und hat sich zigfach bewaehrt.
Use ed once in a while!

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 10.01.2017 10:23:59

@FragDenPinguin
So wie du erläutert hast, sollte es in der Zieldatei zum Schluss aussehen,nur die Zeilen verdreht. :)
Ich probier's aber später,danke :THX:

Code: Alles auswählen

Bitte kein solcher Mischmasch...
Sorry meillo,eigentlich wollte ich es verständlicher gestalten,aber es kam nicht so an, wie ich es im Text formatiert hatte.
Ich versuche es mal so,ohne dass ich ein Codefenster aufsetze, welches mir so ein Mischmasch erzeugt.

Ausgangsformat:

Code: Alles auswählen

#EXTINF:-1,DE-NICK_JR                                                    
http://iptv.abcde.df:8000/live/Znvc/Znvc/1234.ts    
#EXTINF:-1,DE-Disney_Channel_HD                        
http://iptv.abcde.df:8000/live/Znvc/Znvc/2343.ts    
#EXTINF:-1,DE-Disney_XD                                      
http://iptv.abcde.df:8000/live/Znvc/Znvc/2341.ts    
#EXTINF:-1,DE-Disney_Junior                                  
http://iptv.abcde.df:8000/live/Znvc/Znvc/3244.ts     
#EXTINF:-1,DE-Kika_HD                                          
http://iptv.abcde.df:8000/live/Znvc/Znvc/962.ts      
#EXTINF:-1,DE-Disney_Cinemagic                          
http://iptv.abcde.df:8000/live/Znvc/Znvc/976.ts      
Umwandlungsformat:

Code: Alles auswählen

#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/1234.ts:NICK_JR
#DESCRIPTION NICK_JR 
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2343.ts:Disney Channel_HD
#DESCRIPTION Disney_Channel_HD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/2341.ts:Disney_XD
#DESCRIPTION Disney_XD                             
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/3244.ts:Disney_Junior
#DESCRIPTION Disney_Junior                           
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/962.ts:Kika_HD
#DESCRIPTION Kika_HD
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a://iptv.abcde.df:8000/live/Znvc/Znvc/976.ts:Disney_Cinemagic
#DESCRIPTION Disney_Cinemagic
Hoffe, das hilft dir und mir weiter... :)

Aber @Pinguin hat den Ansatz verstanden. :wink:
Zuletzt geändert von Meillo am 10.01.2017 10:55:21, insgesamt 1-mal geändert.
Grund: code-Tags eingefuegt ;-)
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 10.01.2017 11:00:27

tHoRax hat geschrieben:

Code: Alles auswählen

Bitte kein solcher Mischmasch...
Sorry meillo,eigentlich wollte ich es verständlicher gestalten,aber es kam nicht so an, wie ich es im Text formatiert hatte.
Ich versuche es mal so,ohne dass ich ein Codefenster aufsetze, welches mir so ein Mischmasch erzeugt.
Ich hab mir erlaubt die code-Tags zu ergaenzen ... wichtig war mir, dass Quelldaten und Zieldaten klar getrennt sind. (Der Whitespace am Zeilenende ist irrelevant, vermute ich.)

Noch eine Nachfrage: In deinen Zieldaten kommt #SERVICE vor #DESCRIPTION, ich dachte das soll andersrum sein.

Aber sonst ist das eine Basis auf er man arbeiten kann. :-)
Use ed once in a while!

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 10.01.2017 11:08:09

Wenn die #DESCRIPTION vor #SERVICE kommen soll und wenn der eine abweichende Unterstrich ein Versehen war, dann sollte dir dieser Befehl die Umwandlung machen:

Code: Alles auswählen

sed 's/^#EXTINF:-1,DE-//; h; s/^/#DESCRIPTION /; n; s/^http/#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3a/; G; s/\n/:/'
Falls die #DESCRIPTION und #SERVICE doch anders rum sein sollen, kannst du ja einfach noch durch das bekannte

Code: Alles auswählen

sed -n 'h;n;G;p'
pipen.
Use ed once in a while!

FragDenPinguin
Beiträge: 34
Registriert: 06.01.2017 05:41:47

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von FragDenPinguin » 10.01.2017 12:03:26

Code: Alles auswählen

s/^/#DESCRIPTION /;
Cool, danach hatte ich gesucht - habe den Befehl "Am-Zeilenanfang-einfügen" vermisst. :facepalm: :)

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 10.01.2017 12:09:12

FragDenPinguin hat geschrieben:

Code: Alles auswählen

s/^/#DESCRIPTION /;
Cool, danach hatte ich gesucht - habe den Befehl "Am-Zeilenanfang-einfügen" vermisst. :facepalm: :)
;-)

btw: Es ginge selbst ohne Anker (allerdings nur auf Zeilen, die Inhalt haben ... manchmal will man aber ja gerade das):

Code: Alles auswählen

s/./foo&/
Der Punkt matched auf das erste Zeichen (``fruehester laengster Match''). Ersetzt wird es mit dem Wort ``foo'' und sich selbst (`&' im Ersatztext steht fuer dasjenige was gematched hat).
Use ed once in a while!

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 11.01.2017 13:10:40

Das wollte ich gerne noch nachtragen zu meinem Vorgehen: Ich habe die Ausgangsdaten in eine Datei `ist' kopiert und die Zieldaten in eine Datei `soll. Dann habe ich mein Script folgendermassen getestet und verbessert:

Code: Alles auswählen

sed '.....' ist | diff -uw - soll
(Das `-w' Flag von diff(1) habe ich nur verwendet, weil die Daten trailing Whitespace hatten.)

Am Ende soll keine Ausgabe mehr kommen. (So habe ich auch gemerkt, dass der eine Unterstrich abweichend war.)


Und dann wollte ich noch ergaenzen:
FragDenPinguin hat geschrieben:Ich versuche es auch noch einmal, wenn es gestattet ist, weil ich diese Anwendung von sed schon recht spannend finde:
Ich fand sehr schoen, wie du den Befehl schrittweise aufgebaut hast und uns dabei an deinen Gedanken teilhaben hast lassen. Ich schreibe sed-Scripte auch auf diese Weise.

Zu diesem Script noch ein Tipp:

Code: Alles auswählen

sed -n 's/#EXTINF:-1,DE-/#DESCRIPTION /;p;s/#DESCRIPTION //;x;n;s/http\:\/\//#SERVICE 4097\:0\:1\:0\:0\:0\:0\:0\:0\:0\:http%3a\:\/\//;G;s/\n/\:/;p'
Doppelpunkte sind in Regexps keine Metazeichen, die brauchst du also nicht escapen. Und wenn du Suchmuster oder Ersetzungen mit vielen Slashes hast (die du alle escapen muesstest) dann nimm besser einen anderen Delimiter, wie:

Code: Alles auswählen

sed 's,foo,bar,'
Ich nehme gerne das Komma, weil sich das am einfachsten tippen laesst. Oft sieht man aber auch # oder _. (Das Doppelkreuz finde ich persoenlich nicht so praktisch, weil es die Teile optisch eher verbindet als trennt.) Es ist voellig egal welches Zeichen man verwendet. Das was nach dem `s' kommt ist der Delimiter. Es geht also auch sowas:

Code: Alles auswählen

sed 'super sed fun for you'
:-D
Use ed once in a while!

Antworten