sed Frage channels.conf Mich verblüfft ja...

  • immer wieder mit welcher Leichtigkeit der ein oder andere
    recht komplexe sed-Befehle o.ä. aus dem Ärmel schüttelt.


    Hat jemand eine Lösung für folgendes Anliegen?
    Ich möchte in meine channels.conf bei der caid überall eine "5:" davorstellen,
    damit ich die Sender mit Streamdev so nutzen kann :)
    Leider sind das ganz schön viele Sender, ich überlebe mir was mit AutoIt zu basteln, aber das lässt sich sicher auch andersweitig auf der LinuxKonsole lösen.
    Zeilen die mit Doppelpunkt anfangen überspringen.
    Andere Zeilen -> Man könnte die : als Trenner nehmen, dann prüfen ob da schon eine 5 drinsteht falls nicht setzten.
    Vermutlich am simpelsten mit sed aber keine Ahnung wie ich das Prüfen ob schon ne 5 drinsteht mit reinbekomme.

    Software: gen2vdr V3 ( Beta8 ) / gen2vdr V2
    Hardware: Intel 5200EE - 5N7A-VM - Scythe Shuriken - BeQuiet(Netzteil) - X10-USB Remote
    SMT 7020S & P3@900 - Testsystem mit FF und X10-USB Remote
    Links für Neueinsteiger


    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

  • Ich hoffe, Du nimmst auch eine Lösung mit awk ;):

    Code
    awk 'BEGIN {FS=OFS=":"} $9 !~ /^($|5(,|$))/ {if ($9 == "0") $9 = "5"; else $9 = "5," $9} {print}'


    Alternativ den localchannelprovide-Patch aus den streamdev-Sourcen auf VDR anwenden.

  • Hi,


    auch wenn Schmirl schneller war, ich hab ne sed Lösung :P


    Code
    sed 's/^\(.*:.*:.*:.*:.*:.*:.*:.*:\).*\(:.*:.*:.*:.*$\)/\15\2/' channels.conf > channels.neu


    Macht aus:

    Das hier:



    Also an jede 9. von Doppelpunkten umgebene Stelle eine 5.
    Wenn du es weiter angepasst haben willst oder so kannste dich ja noch mal melden :)


    Grüße
    sphere

    silence: Ubuntu 9.10 | Asus M3N78-VM | AMD 4450e | TT-budget S2-1600 DVB-S2 | 5 X 1TB Raid5 | vdr (1.7.10) | xbmc opdenkamp master | Optoma HD65 Beamer | Samsung LE37B530 LCD | Onkyo 605 AVR | Heco Victa 700/300/100/25A

  • Code
    awk 'BEGIN {FS=OFS=":"} $9 !~ /^($|5(,|$))/ {if ($9 == "0") $9 = "5"; else $9 = "5," $9} {print}'


    FS ... setzt den Trenner dann die neunte Spalte die nicht mit "5" anfängt.
    Dann prüfe ob "0" falls ja tausche falls nein füge hinzu.
    Ich ahne verstehe was es macht, verstehe dies aber nicht 100%
    Was passiert da genau?


    Code
    sed 's/^\(.*:.*:.*:.*:.*:.*:.*:.*:\).*\(:.*:.*:.*:.*$\)/\15\2/' channels.conf > channels.neu


    Suche ^\(.*:.*:.*:.*:.*:.*:.*:.*:\).* alles was mit einem Zeichen beginnt und weitere hat ".?"
    Erstzen mit (:.*:.*:.*:.*$\)/\15\2/ "Nun zählt er von hinten $?"
    "\15\2/" was macht das, irgendwie vermisse ich noch ein /g am Ende?


    Besten Dank beiden Kandidaten, da ich sed immer nur für "recht einfache" Suchen& Ersetzen Aktionen gebraucht habe.
    Awk noch weniger benutze nicht hauen, bin ich erstaunt das ich syntaktisch vom dem SED Script weniger verstehe was da passiert :versteck


    Mir ist da jeder Weg recht, es sollte kein Glaubenskrieg werden welches Tool am Besten geht :lol2


    Aber als ich mir ein paar Beispiele "erweiteterModus" angesehen/ausprobiert habe musste ich manchmal auch schon schlucken.
    SED & AWK sind noch mal ne ganz eigene Welt (für mich).
    Es wäre schön wenn jemand noch mit ein/zwei Sätzen die mir unklaren Punkte erklären kann .


    Gruß N!ce

    Software: gen2vdr V3 ( Beta8 ) / gen2vdr V2
    Hardware: Intel 5200EE - 5N7A-VM - Scythe Shuriken - BeQuiet(Netzteil) - X10-USB Remote
    SMT 7020S & P3@900 - Testsystem mit FF und X10-USB Remote
    Links für Neueinsteiger


    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

    Einmal editiert, zuletzt von Mr.N!ce ()

  • Zitat

    Original von Mr.N!ce

    Code
    sed 's/^\(.*:.*:.*:.*:.*:.*:.*:.*:\).*\(:.*:.*:.*:.*$\)/\15\2/' channels.conf > channels.neu


    Suche ^\(.*:.*:.*:.*:.*:.*:.*:.*:\).* alles was mit einem Zeichen beginnt und weitere hat ".?"
    Erstzen mit (:.*:.*:.*:.*$\)/\15\2/ "Nun zählt er von hinten $?"
    "\15\2/" was macht das, irgendwie vermisse ich noch ein /g am Ende?


    Ehrlich gesagt kann ich deine Interpretation von dem sed Script nicht nachvollziehen ;)


    Ich hoffe mal, dir sind reguläre Ausdrücke (regexps) nicht vollkommen fremd, darauf baut das sed-Kommando "s" nämlich auf. Ich werde regexps hier nicht komplett erklären, das würde mir heut abend zu lange dauern.


    Beim sed gibt es mehrere Kommandos, eins davon ist "s" für Suchen und Ersetzen mit regulären Ausdrücken. Die Syntax ist in etwa wie folgt:

    Code
    s/<Such-Regexp>/<Ersetzung>/<Option(en?)>


    Der Schrägstrich ist dabei ein Trennzeichen, welches beliebig gewählt werden kann. Man könnte also auch drei Rauten "#" benutzen oder was auch immer.


    Das Suchen und Ersetzen läuft zeilenweise ab und bearbeitet normalerweise nur den ersten Treffer in einer Zeile. Wenn mehrere Treffer pro Zeile bearbeitet werden sollen, kann man als Option "g" am Ende mitgeben. In diesem Fall kann man sich das "g" sparen, weil es höchstens einen Treffer pro Zeile geben wird.


    Kommen wir zu dem regulären Ausdruck, der den zu suchenden Text beschreibt:

    Code
    ^\(.*:.*:.*:.*:.*:.*:.*:.*:\).*\(:.*:.*:.*:.*$\)


    Bei regulären Ausdrücken bedeutet das Zeichen "^" Zeilenanfang und das Dollar-Zeichen "$" Zeilenende. Der Punkt "." steht für exakt ein beliebiges Zeichen. Der Kleene-Stern "*" wirkt sich auf den letzten Teilausdruck aus und hängt diesen beliebig oft hintereinander - null mal bis unendlich oft. Der Doppelpunkt hat keine besondere Bedeutung sondern beschreibt einfach das Zeichen Doppelpunkt im Eingabetext.


    Außerdem kann man Teil-Ausdrücke festlegen, mit runden Klammern und vorgestelltem Backslash - also so: "\(<Teilausdruck>\)". Auf den Text, der anhand des Teilausdrucks gefunden wird, kann man dann in der Ersetzung mit \<fortlaufende Nummer> zugreifen.


    Also das erste Klammernpaar beschreibt die ersten acht durch Doppelpunkte getrennten Zahlenfelder. Dieser komplette Text inklusive Doppelpunkte wird in der Ersetzung mit "\1" wieder ausgegeben. Nach der ersten schließenden Klammer wird mit ".*" wieder eine beliebig lange Zeichenkette beliebiger Zeichen erwartet - der Inhalt des neunten Feldes. Dieser Inhalt wird verworfen und durch das Zeichen "5" in der Ausgabe ersetzt. Das neunte Feld sollte ja die CAID sein und überall auf 5 gesetzt werden. Danach folgt das zweite Klammernpaar, welches die verbleibenden vier durch Doppelpunkte getrennten Felder beschreibt. Der entsprechende Text wird mit "\2" in die Ausgabe kopiert.


    Ich hoffe mal das war halbwegs verständlich für dich.

    VDR1: P-II 233MHz, Nova DVB-S budget card, 4x160GB, e1000-NIC / Debian Etch, VDR-1.4.7
    VDR2: SMT-7020S / det's Debian ISO v2b

  • Zitat

    Bei regulären Ausdrücken bedeutet das Zeichen "^" Zeilenanfang und das Dollar-Zeichen "$" Zeilenende. Der Punkt "." steht für exakt ein beliebiges Zeichen. Der Kleene-Stern "*" wirkt sich auf den letzten Teilausdruck aus und hängt diesen beliebig oft hintereinander - null mal bis unendlich oft. Der Doppelpunkt hat keine besondere Bedeutung sondern beschreibt einfach das Zeichen Doppelpunkt im Eingabetext.


    Bekannt ;)


    Zitat

    Also das erste Klammernpaar beschreibt die ersten acht durch Doppelpunkte getrennten Zahlenfelder. Dieser komplette Text inklusive Doppelpunkte wird in der Ersetzung mit "\1" wieder ausgegeben. Nach der ersten schließenden Klammer wird mit ".*" wieder eine beliebig lange Zeichenkette beliebiger Zeichen erwartet - der Inhalt des neunten Feldes. Dieser Inhalt wird verworfen und durch das Zeichen "5" in der Ausgabe ersetzt. Das neunte Feld sollte ja die CAID sein und überall auf 5 gesetzt werden. Danach folgt das zweite Klammernpaar, welches die verbleibenden vier durch Doppelpunkte getrennten Felder beschreibt. Der entsprechende Text wird mit "\2" in die Ausgabe kopiert.


    Jetzt wirds klarer .... Danke

    Software: gen2vdr V3 ( Beta8 ) / gen2vdr V2
    Hardware: Intel 5200EE - 5N7A-VM - Scythe Shuriken - BeQuiet(Netzteil) - X10-USB Remote
    SMT 7020S & P3@900 - Testsystem mit FF und X10-USB Remote
    Links für Neueinsteiger


    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

  • Zitat
    Code
    awk 'BEGIN {FS=OFS=":"} $9 !~ /^($|5(,|$))/ {if ($9 == "0") $9 = "5"; else $9 = "5," $9} {print}'


    FS ... setzt den Trenner dann die neunte Spalte die nicht mit "5" anfängt.
    Dann prüfe ob "0" falls ja tausche falls nein füge hinzu.
    Ich ahne verstehe was es macht, verstehe dies aber nicht 100%
    Was passiert da genau?


    Das hast Du soweit schon alles richtig verstanden. Der BEGIN-Block wird vor der Verarbeitung der Datei ausgeführt und initialisiert den Trenner für das Einlesen (FS) und die Ausgabe (OFS - Output Field Seperator).


    Jetzt wird die Datei zeilenweise eingelesen und am Doppelpunkt getrennt.


    Der nächste Block kümmert sich um Feld Nummer 9. Wir suchen die Zeilen bei denen $9

    • leer ist: /^$/ (Zeilen mit Gruppenname)
    • bereits "5" ist: /^5$/
    • oder mit "5," beginnt: /^5,/ (für verschlüsselte Kanäle)


    Zusammengefasst in einer regular expression: /^($|5(,|$))/
    Wenn diese expression nicht passt (!~) wird "0" mit "5" ersetzt bzw. ein "5," vorangestellt.


    Schließlich wird jede Zeile mit print ausgegeben - durch OFS=":" mit Doppelpunkt getrennt.


    Hier noch eine alternative sed-Variante:

    Code
    sed -e 's#^\(\([^:]\+:\)\{8\}\)\([^:]\+:\)#\15:#'
    • Suche nach mindestens einem nicht-Doppelpunkt gefolgt von Doppelpunkt: [^: ]\+:
    • Diesen Block 8 mal: \{8\}
    • Danach wieder mindestens ein nicht-Doppelpunkt gefolgt von Doppelpunkt
    • Ersetze es mit der ersten Klammer (also der 8 Felder): \1
    • hänge "5:" an


    Wie bei sphere kegelt diese sed Variante alle CA-Infos bei verschlüsselten Kanälen raus (was für den Streamdev-Client in Ordnung sein sollte). War deshalb aber auf awk umgestiegen.

  • Jepp,


    da hat chade (natürlich) alles richtig und super erklärt :)


    Ungeklärt bleibt aber, ob die sed Lösung dir reicht bzw. das tut, was du wolltest.
    Ich habe immer noch nicht verstanden, warum genau du überall ne 5 bei CAID haben willst...


    Ich wollts aber trotzdem auch noch mal in ganz kurz erklären was meine sed Anweisung macht:


    Sie sucht in jeder Zeile die ersten 8 Doppelpunkt-Felder, merkt sie sich; sucht noch die 10-13. Felder und merkt sie sich auch.
    Dann schnibbelt sie Felder 1-9, die von dir gewünschte 5 und schließlich die Felder 10-13 Zusammen, fertig.


    Grüße
    sphere

    silence: Ubuntu 9.10 | Asus M3N78-VM | AMD 4450e | TT-budget S2-1600 DVB-S2 | 5 X 1TB Raid5 | vdr (1.7.10) | xbmc opdenkamp master | Optoma HD65 Beamer | Samsung LE37B530 LCD | Onkyo 605 AVR | Heco Victa 700/300/100/25A

  • Mensch meier, schonwieder war Schmirl ein klitzekleinesbisschen schneller als ich, grrr ;) Wir haben wohl nahezu identische Arbeitszeiten...



    Ich hatte schon erwartet, dass einer diese "Acht mal nicht Doppelpunkt Doppelpunkt"-Lösung bringt, aber ich selbst hatte in dem Moment den Gedanken schnell verworfen da ich lieber 8 mal .*: ausschreibe :D



    Grüße
    sphere

    silence: Ubuntu 9.10 | Asus M3N78-VM | AMD 4450e | TT-budget S2-1600 DVB-S2 | 5 X 1TB Raid5 | vdr (1.7.10) | xbmc opdenkamp master | Optoma HD65 Beamer | Samsung LE37B530 LCD | Onkyo 605 AVR | Heco Victa 700/300/100/25A

  • Zitat

    Mensch meier, schonwieder war Schmirl ein klitzekleinesbisschen schneller als ich, grrr ;) Wir haben wohl nahezu identische Arbeitszeiten...

    :lol2


    Zitat

    Ich hatte schon erwartet, dass einer diese "Acht mal nicht Doppelpunkt Doppelpunkt"-Lösung bringt, aber ich selbst hatte in dem Moment den Gedanken schnell verworfen da ich lieber 8 mal .*: ausschreibe :D


    Ack. Deutlich hübscher wird's mit extended regular expressions (gehören aber soweit ich weiß nicht zum Standard sed)

    Code
    sed -re 's#^(([^:]+:){8})([^:]+:)#\15:#'
  • Ich habe immer noch nicht verstanden, warum genau du überall ne 5 bei CAID haben willst...


    Ich nutze einen HauptVDR mit StreamdevServer und eine SMT StreamdevClient.
    Habe auf beiden die gleiche channel.conf und kann so umschalten wie lokal am Hauptvdr.


    Siehe hier: http://www.vdr-wiki.de/wiki/in…mdev-plugin#Konfiguration


    Auszug:

    Software: gen2vdr V3 ( Beta8 ) / gen2vdr V2
    Hardware: Intel 5200EE - 5N7A-VM - Scythe Shuriken - BeQuiet(Netzteil) - X10-USB Remote
    SMT 7020S & P3@900 - Testsystem mit FF und X10-USB Remote
    Links für Neueinsteiger


    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

  • Ich habe immer noch nicht verstanden, warum genau du überall ne 5 bei CAID haben willst...


    Ich nutze einen HauptVDR mit StreamdevServer und eine SMT StreamdevClient.
    Habe auf beiden die gleiche channel.conf und kann so umschalten wie lokal am Hauptvdr.


    Siehe hier:http://www.vdr-wiki.de/wiki/in…mdev-plugin#Konfiguration


    Auszug:

    Software: gen2vdr V3 ( Beta8 ) / gen2vdr V2
    Hardware: Intel 5200EE - 5N7A-VM - Scythe Shuriken - BeQuiet(Netzteil) - X10-USB Remote
    SMT 7020S & P3@900 - Testsystem mit FF und X10-USB Remote
    Links für Neueinsteiger


    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

    Einmal editiert, zuletzt von Mr.N!ce ()

  • Achso...


    Ich hatte nie einen VDR mit zwei DVB Karten, deswegen hatte ich das noch nie gelesen bzw. benutzt. Aber gut zu wissen.


    Hat dir eins von den reichlichen Scripten hier denn jetzt geholfen um das Problem so wie du wolltest zu lösen?


    Grüße
    sphere

    silence: Ubuntu 9.10 | Asus M3N78-VM | AMD 4450e | TT-budget S2-1600 DVB-S2 | 5 X 1TB Raid5 | vdr (1.7.10) | xbmc opdenkamp master | Optoma HD65 Beamer | Samsung LE37B530 LCD | Onkyo 605 AVR | Heco Victa 700/300/100/25A

    Einmal editiert, zuletzt von sphere ()

  • Hallo bin fertig mit der Verkabelung, ok das Script hätte ich auch vorher ausführen
    (zur Not von überall...wie die meisten hier :) ), aber ich will mich auch gleich mit Funktion belohnen. :lol2


    So die sed Variante macht das was Sie soll, entfernt aber wie angedroht alle anderen CA IDs.
    Die awk Variante klappt auch dort uberleben aber andere Ids.
    Da die SMT auch ohne Streamdev lebensfähig ist werde ich die awk Variante vorziehen.
    PS.:Auch ein mehrmaliger Aufruf also zum Nacharbeiten klappt. Ach und funktonieren tuts auch (TV-BILD) :)

    Software: gen2vdr V3 ( Beta8 ) / gen2vdr V2
    Hardware: Intel 5200EE - 5N7A-VM - Scythe Shuriken - BeQuiet(Netzteil) - X10-USB Remote
    SMT 7020S & P3@900 - Testsystem mit FF und X10-USB Remote
    Links für Neueinsteiger


    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

    2 Mal editiert, zuletzt von Mr.N!ce ()

  • Zitat

    das ist genau das was ich suche ..... also ich möchte dass der Inhalt in jeder Zeile zwischen dritten und vierten Doppelpunkt durch zB. S4.8E ersetzt wird. Ist sowas auch möglich?


    Klar - hier die zugehörigen sed-Lösungen. Such Dir die schönste aus:

    Code
    sed -re 's#^(([^:]+:){3})[^:]+:#\1S4.8E:#' channels.conf > channels.neu
    sed -e 's#^\(\([^:]\+:\)\{3\}\)[^:]\+:#\1S4.8E:#' channels.conf > channels.neu
    sed 's/^\(.*:.*:.*:\).*\(:.*:.*:.*:.*:.*:.*:.*:.*:.*$\)/\1S4.8E\2/' channels.conf > channels.neu


    sphere: Hey - was los? Habe extra 5 Minuten länger gewartet bevor ich die Antwort gepostet habe :unsch

  • :( gerade erst gesehen, ich glaub ich sollte diesen Thread abonnieren...


    Grüße
    -sphere

    silence: Ubuntu 9.10 | Asus M3N78-VM | AMD 4450e | TT-budget S2-1600 DVB-S2 | 5 X 1TB Raid5 | vdr (1.7.10) | xbmc opdenkamp master | Optoma HD65 Beamer | Samsung LE37B530 LCD | Onkyo 605 AVR | Heco Victa 700/300/100/25A

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!