Sed-Einzeiler zur Bearbeitung von Streamdatei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 01.01.2017 17:09:03

hallo community.
Ich wünsche euch allen erstmal ein frohes,neues Jahr und hoffe inständig für uns alle, dass dieses Jahr für uns alle ein Besseres wird.
So, nun zu meinem diesjährigen Problem.
Ich habe eine ellenlange Streamdatei für IPTV und würde gerne bestimmte Sequenzen aus dieser Datei vom Anfang bis zum Ende rauslöschen mit sed, nur bekomme ich nicht das richtige Ergebnis.
In der Textdatei sieht es so aus:

#EXTINF:-1,[MUSICA] [ MTV Dance]
|


Nun versuche ich mit sed in Zeilen, in denen der reguläre Ausdruck "#EXTINF:-1,[irgendwas] steht zu löschen, damit danach der Name des Senders drin bleibt, aber ich bekomme es nicht hin. Es wird alles auf den Zeilen gelöscht.
Der sed-Befehl sieht so aus:

sed 's/#EXTINF:-1, /d' file.txt .Wie gesagt, wird alles gelöscht, dass die RegEx enthält.

Kann mir jemand auf die Sprünge helfen?
Zuletzt geändert von tHoRax am 01.01.2017 17:19:45, insgesamt 2-mal geändert.
/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
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von heisenberg » 01.01.2017 17:16:26

Diese Syntax s/Muster/d geht so nicht. Ich vermute dass d als Kommando "Zeile löschen, wenn Muster gefunden" interpretiert wird. Probiere es mal so:

Code: Alles auswählen

sed 's/#EXTINF:-1, //' file.txt
Bitte Code-Tags verwenden.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von rodney » 01.01.2017 17:25:33

sed 's/MUSTER/d' bringt bei mir ein Fehlermeldung bzgl. einem nicht abgeschlossenen substitute Kommandos.

Vielleicht magst du es einmal mit sed 's/MUSTER//' versuchen.Wenn MUSTER immer am Zeilenanfang steht waere ^MUSTER sinnvoller.

Dein "d" (delete) am Ende vertraegt sich nicht mit dem "s" (substitute) am Anfang ;-)

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 01.01.2017 17:32:55

hallo.
Eure Lösungsansätze haben mich schon weitergebracht, beide klappen nur bedingt, namlich bis hier:

#EXTINF:-1,[MUSICA] MTV Dance

Eigentlich sollte der Ausdruck in den eckigen Klammern aucg gelöscht werden. :roll:
/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
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von heisenberg » 01.01.2017 17:49:57

Code: Alles auswählen

[MUSICA]
Das ist ein RegEx-Pattern. Sprich die eckigen Klammern haben eine Sonderbedeutung, die Du aufheben("quoten") musst, wenn Du die tatsächlichen Zeichen haben möchtest. Also so:

Code: Alles auswählen

\[MUSICA\]
bzw. so(Weil sich die Shell die ersten Quotes wegschnappt):

Code: Alles auswählen

\\[MUSICA\\]
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 01.01.2017 17:52:45

@heissenberg,rodney

Wie kann ich noch die eckigen Klammer beseitigen?Keiner ne Idee? :roll:

Ich möchte auch die eckigen Klammer samt Inhalt auch beseitigen, dass nur noch der Sendername in der Zeile steht, wo auch immer der Ausdruck #EXTINF:-1,[****] vorkommt.Rodney der o.g Ausdruck steht immer am Anfang einer Zeile.

P.S:
@heissenberg

Unsere Antworten haben sich gegenseitig überschnitten :lol:

Aber die verschiedenen Inhalte der eckigen Klammern würde ich gerne weg haben.
/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
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von heisenberg » 01.01.2017 17:56:29

Schau Dir mal reguläre Ausdücke an: https://danielfett.de/de/tutorials/tuto ... ausdrucke/
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von rodney » 01.01.2017 17:59:32

Eventuell moechtest du alles inklusive ersten"] loeschen:

Code: Alles auswählen

sed 's/^[^\]]*.//'

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von rodney » 01.01.2017 18:03:30

heisenberg hat geschrieben:Schau Dir mal reguläre Ausdücke an: https://danielfett.de/de/tutorials/tuto ... ausdrucke/
Danke fuer den Link. Kannte ich noch nicht und macht beim ersten Ueberflug einen guten Eindruck.

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 01.01.2017 18:04:24

Ja Rodney. Aber mit deinem Code wirderden die Zeichen "#E" gelöscht und der Rest der Zeile wird ausgegeben,
Da stimmt was nicht, bitte prüfen.
/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

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von rodney » 01.01.2017 18:06:17

Args da war ungetestet und hat kleinen Fehler. Korrigierte Version:

Code: Alles auswählen

sed 's/^[^]]*.//'

dufty2
Beiträge: 1709
Registriert: 22.12.2013 16:41:16

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von dufty2 » 01.01.2017 18:07:33

Code: Alles auswählen

$ sed 's/#EXTINF:-1,\[.*\] \[/\[/' file.txt
Stichwörter hierfür wären "sed non greedy".

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 01.01.2017 18:23:10

Klappt irgendwie nicht.
Rodney dein Code löscht alle Zeilen, die nicht nur den Ausdruck enthält, sondern auch alle URL's, die darauf folgen.
Nur die Sendernamen werden ausgegeben.
Die Zeilen sind folgendermaßen aufgebaut:

#EXTINF:-1,[MUSICA] MTV Rocks
http://debianforum.de/forum/
#EXTINF:-1,[MUSICA] MTV Hits
http://debianforum.de/forum
...
...
...
etc.

Ich möchte nur alles was mit #EXTINF:-1,[MUSICA], also bis einschliesslich ] löschen die Sendernamen und die darunterfolgenden URL's behalten.
Beim Ansatz von Rodney bleiben zwar die Sendernamen, aber die URL's verschwinden.

Bei dufty wird die Datei ausgegeben, so wie sie 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

rodney
Beiträge: 332
Registriert: 09.12.2016 04:15:59

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von rodney » 01.01.2017 18:29:27

Koenntest du mal bitte ein paar Zeilen auf pastebin.php pasten?

Ansonsten folgendes versuchen:

Code: Alles auswählen

sed 's/#EXTINF:-1,[^]]*.\s//'

dufty2
Beiträge: 1709
Registriert: 22.12.2013 16:41:16

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von dufty2 » 01.01.2017 18:37:46

Mmmh, also im ersten Post hast Du den 'Sender' in eckigen Klammern angegeben.
Dann halt so:

Code: Alles auswählen

$ sed 's/#EXTINF:-1,\[.*\] //' file.txt
MTV Rocks
http://debianforum.de/forum/
MTV Hits
http://debianforum.de/forum

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 01.01.2017 20:39:03

Irgendwie geht im neuen Jahr einiges so ziemlich schief, Im Nachhinein stelle ich fest, daß mein letzter Beitrag gar nicht auftaucht.
Ich möchte hier nochmals allen Danken.Der letzte Beitrag von rodney hats auf den Punkt gebracht, das was ich eigentlich machen wollte :lol: Danke rodney
/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

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 06.01.2017 22:17:55

Wie kann/könnte ich (noch) :) mit sed 2 Zeileninhalte, j-die jeweils zusammengehören- in der Datei, umkehren?
Hört sich kompliziert an, ist aber nicht so.

Beispiel:

#DESCRIPTION ....irgedwas
#SERVICE 4097....irgendwas
#DESCRIPTION ....irgedwas
#SERVICE 4097....irgendwas
#DESCRIPTION ....irgedwas
#SERVICE 4097....irgendwas
#DESCRIPTION ....irgedwas
#SERVICE 4097....irgendwas
usw.

Wie gesagt, Zeile 1>--->Zeile 2,, Zeile 3 <--->Zeile 4, Zeile 5 <---> Zeile 6, also zu einem paar die Pl#tze tauschen und das bis ans Ende der Datei.

Ist das möglich?
/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
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von heisenberg » 06.01.2017 22:31:12

Mal aus dem hohlen Bauch heraus geraten...

Code: Alles auswählen

awk 'NR%2==1{b=$0;next}{print $0,b}'
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 06.01.2017 23:34:41

Zeilen tauschen:

Code: Alles auswählen

sed -n 'h;n;G;p'
(Kurzerklaerung: Zeile speichern, naechste Zeile einlesen, gespeicherte Zeile anhaengen, ausgeben.)
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von heisenberg » 07.01.2017 01:03:06

Code: Alles auswählen

perl -pe '$_=<>.$_'
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von tHoRax » 09.01.2017 00:22:46

Code: Alles auswählen

    sed -n 'h;n;G;p'


(Kurzerklaerung: Zeile speichern, naechste Zeile einlesen, gespeicherte Zeile anhaengen, ausgeben.)
@meillo
Ich bin überwältigt von dieser kurzen aber wirkungsvollen Lösung,perfekt!Danke meillo,toll ausgeführt :wink:
Danke euch allen. :THX:

@meillo

Code: Alles auswählen

 
1    (DE) Mei Musi TV
2    http://ixxxxxxxxxxxxxxxxxxxxxx.ts
3    (DE) MeinTVshop
4    http://xxxxxxxxxxxxxxxxxxxxxxx.ts
5    (DE) München TV
6    http://ixxxxxxxxxxxxxxxxxxxxxxx.ts
7    (DE) Regio TV
8    http://xxxxxxxxxxxxxxxxxxxxxxxx.ts
9    (DE) RFO
10  http://xxxxxxxxxxxxxxxxxxxxxxxxx.ts
Wie kann ich jetzt bspw. den Sendernamen der ersten Zeile "(DE) Mei Musi TV" an das Ende der 2.Zeile hinter "ts" mit Doppelpunkt(:) anhängen?Selbe gilt bis ans Ende der Datei.

Als Beispiel:

Code: Alles auswählen

1 http://ixxxxxxxxxxxxxxxxxxxxxx.ts: (DE) Mei Musi TV 
Die Zeilennummern dienen hier nur zur Verdeutlichung, zum Verständis.
Wie erwähnt, von oben nach ganz unten den jeweiligen Sendernamen mit ":" an die Erweiterung der entsprechenden "ts" anhängen.
/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 » 09.01.2017 02:27:04

Code: Alles auswählen

sed -n 'h;n;s/\.ts/\.ts\:/;G;s/\n//;s/^[ ]*//;s/\.ts\:[ ]*/\.ts: /;p'

Code: Alles auswählen

http://ixxxxxxxxxxxxxxxxxxxxxx.ts: (DE) Mei Musi TV
http://xxxxxxxxxxxxxxxxxxxxxxx.ts: (DE) MeinTVshop
http://ixxxxxxxxxxxxxxxxxxxxxxx.ts: (DE) München TV
http://xxxxxxxxxxxxxxxxxxxxxxxx.ts: (DE) Regio TV
http://xxxxxxxxxxxxxxxxxxxxxxxxx.ts: (DE) RFO

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 10:24:19

tHoRax hat geschrieben: Wie kann ich jetzt bspw. den Sendernamen der ersten Zeile "(DE) Mei Musi TV" an das Ende der 2.Zeile hinter "ts" mit Doppelpunkt(:) anhängen?Selbe gilt bis ans Ende der Datei.
Ganz einfach, nach dem Zusammenhaengen der Zeilen (G-Kommando) ersetzt du den Zeilenumbruch durch ``: '':

Code: Alles auswählen

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

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

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von Meillo » 09.01.2017 10:27:42

btw:
heisenberg hat geschrieben:

Code: Alles auswählen

perl -pe '$_=<>.$_'
Das finde ich auch einen netten Ansatz, wegen der dahinter stehenden Denkweise. Dafuer mag ich Perl dann doch. :-)
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Sed-Einzeiler zur Bearbeitung von Streamdatei

Beitrag von heisenberg » 09.01.2017 10:53:40

Einen hätte ich noch:

Code: Alles auswählen

awk '{getline b;print b"\n"$0}'
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Antworten