staging.inyokaproject.org

Bestimmte Zeichenfolge innerhalb von Zeichen löschen

Status: Gelöst | Ubuntu-Version: Ubuntu 18.10 (Cosmic Cuttlefish)
Antworten |

HamburgJoe

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Moin Moin,

ich mal wieder... =)

Dieses mal geht es um eine M3U Liste in der ich folgendes ändern möchte. Ich habe diverse Sender ids die ein FHD, HD und SD enthalten. So in etwas sieht es aus:

1
2
3
4
5
6
tvg-id="Sender 1 HD DE"
tvg-id="Sender 1 FHD DE"
tvg-id="Sender 2 HD DE"
tvg-id="Sender 2 FHD DE"
tvg-id="Sender 3 SD DE"
tvg-id="Sender 3 HD DE"

Allerdings geht es um mehrere 100 Sender.

Wie kann ich nun z.B. sed sagen suche zwischen id=" und " nach FHD, HD, SD und ersetze diese Zeichenfolge mit nichts?

So soll es dann aussehen:

1
2
3
4
5
6
tvg-id="Sender 1 DE"
tvg-id="Sender 1 DE"
tvg-id="Sender 2 DE"
tvg-id="Sender 2 DE"
tvg-id="Sender 3 DE"
tvg-id="Sender 3 DE"

Danke und Beste Grüße,

Joe

Prof._Frink

Anmeldungsdatum:
29. Mai 2010

Beiträge: 1096

Hi,

das geht so:

1
sed 's/\(Sender [0-9]*\).*\ \(.*\)/\1 \2/g'

Viele Grüße,

Frink

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Moin Frink,

danke für Deine Antwort. Ich habe mich leider nicht korrekt genug ausgedrückt.

Genau genommen sieht es bei mir so aus:

1
2
3
4
5
6
tvg-id="RTL HD DE"
tvg-id="RTL FHD DE"
tvg-id="RTL || HD DE"
tvg-id="ARD FHD DE"
tvg-id="ZDF SD DE"
tvg-id="Super RTL HD DE"

Können wir den sed Befehl entsprechend anpassen?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

1
sed 's/ [A-Z]{2,3} DE$/ DE/' alt.m3u > neu.m3u

Das sucht nach Leerzeichen, 2-3 Großbuchstaben*, Leerzeichen, "DE" und Zeilenende und ersetzt es durch DE (Zeilenende muss nicht explizit angegeben werden - im Gegenteil, es kann auch nicht unterdrückt werden.

Das abschließende /g war oben schon falsch, da man das Muster nur 1x pro Zeile sucht. /g (global) verwendet man, wenn man beliebig viele Vorkommen ersetzen möchte.

*) 2-3 Großbuchstaben findet HD, SD und FHD. Wenn es weitere Kürzel gibt, etwa 4-stellige oder solche mit Ziffern, müsste das entsprechend angepasst werden.

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Danke für Eure hilfe. Ausgeführt habe ich:

1
sed 's/ [A-Z]{2,3} DE$/ DE/' alt.m3u > neu.m3u

Leider tut sich in meiner m3u so gar nichts:

1
2
3
4
5
#EXTM3U
#EXTINF:-1 tvg-id="13th Street HD DE" tvg-name="13th Street HD DE" tvg-logo="http://195.154.221.171/picons/13thstreethdde.png" group-title="TV Deutsch",13th Street HD DE
http://XXX.XXX.XX
#EXTINF:-1 tvg-id="3sat HD DE" tvg-name="3sat HD DE" tvg-logo="http://195.154.221.171/picons/3sathdde.png" group-title="TV Deutsch",3sat HD DE
http://XXX.XXX.XX

Nun muss ich auch zu bedenken geben, das der einzige Text der sich ändern soll auf die

1
tvg-id="13th Street HD DE"

bezieht. Der rest, also

1
tvg-name="13th Street HD DE"

soll so bleiben wie er ist...

Ideen??

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

HamburgJoe schrieb:

Leider tut sich in meiner m3u so gar nichts:

Wenn die Datei direkt ueberschrieben werden soll, dann -i hinzufuegen - Backup nicht vergessen. Ohne bekommst du die Ausgabe, was passieren wuerde.

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Hallo sebix,

danke für die Antwort.

Leider sieht die neue Datei genau so aus wie die alte. Da ändert auch ein -i nichts dran.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Wenn du die Variante mit der Weiterleitung ausgefuehrt hast (>), dann ist das Ergebnis in neu.m3u. Ansonsten ist die regex unpassend.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mit Perl könnte man für Sender, deren tvg-id auf DE endet z.B. sowas machen:

perl -pi -e 's/(?<=tvg-id=")([^"]*)\s(FHD|SD|HD)(?=\sDE")/\1/g;' channels.m3u 

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Vielen Dank seahawk1986, das hat mit perl super funktioniert.

Euch allen einen schönen Tag noch. =)

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

HamburgJoe schrieb:

Danke für Eure hilfe. Ausgeführt habe ich:

1
sed 's/ [A-Z]{2,3} DE$/ DE/' alt.m3u > neu.m3u

Leider tut sich in meiner m3u so gar nichts:

Ja, mein Fehler. Es hätte heißen müssen:

1
sed -r 's/ [A-Z]{2,3} DE"$/ DE"/' alt.m3

Das -r ist nötig um reguläre Ausdrücke richtig zu verarbeiten; alternativ kann man auch die geschweiften Klammern maskieren:

1
sed  's/ [A-Z]\{2,3\} DE"$/ DE"/' alt.m3u

Der zweite Fehler war, zu übersehen, dass die Zeilen nicht mit DE enden, sondern mit DE". Das Dollar sorgt dafür, dass der Ausdruck am Zeilenende verankert ist.

1
2
3
4
5
#EXTM3U
#EXTINF:-1 tvg-id="13th Street HD DE" tvg-name="13th Street HD DE" tvg-logo="http://195.154.221.171/picons/13thstreethdde.png" group-title="TV Deutsch",13th Street HD DE
http://XXX.XXX.XX
#EXTINF:-1 tvg-id="3sat HD DE" tvg-name="3sat HD DE" tvg-logo="http://195.154.221.171/picons/3sathdde.png" group-title="TV Deutsch",3sat HD DE
http://XXX.XXX.XX

Tja - ich habe zwar auch irgendwo einen m3u-File rumliegen, aber vor 10 Jahren angelegt und seither tut er was er soll und wurde von mir nicht wieder angeschaut.

Bei regulären Ausdrücken musst Du schon zeigen, was der exemplarische Input ist und wie der exemplarische Output aussieht, nicht eine simplifizierte Form, sonst musst Du in der Lage sein die simplifizierte Lösung in Dein Problem zurückzuübersetzen.

Nun muss ich auch zu bedenken geben, das der einzige Text der sich ändern soll auf die

1
tvg-id="13th Street HD DE"

bezieht. Der rest, also

1
tvg-name="13th Street HD DE"

soll so bleiben wie er ist...

Gut - jetzt bist Du ja mit Perl glücklich geworden ...

Antworten |