ubuntuusers.de

Schleife macht immer noch Probleme

Status: Ungelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

Wolfmann

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Hallo,

Hier mal der Code zu der Schleife.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
kept_lines=()
                        read -p "Welche Zeilen sollen behalten werden" lines_to_keep
                        IFS=',' read -ra hold_lines_tokens <<< "$lines_to_keep"
                        for token in "${hold_lines_tokens[@]}"; do
                                if [[ "$token" =~ "-" ]]; then
                                        IFS='-' read -ra range_keep <<< "$token"
                                        start=${range_keep[0]}
                                        end=${range_keep[1]}
                                        for ((i=start; i <= end; i++)); do
                                                kept_lines+=("$i")
                                        done
                                else
                                        kept_lines+=("$token")
                                fi
                        done
                        for line in "${kept_lines[@]}"; do
                                sed -n  "/$line/p" <neu.txt > neu2.txt
                                echo "Dateianzeige $line"
                                nl -ba neu2.txt
                        done
                        cp neu2.txt neu.txt
                        rm neu2.txt

Eigentlich sollte ja pro Durchlauf der for line Schleife jedesmal die Zeile, die das array kept_lines an Wert übergibt aus der Datei neu.txt in die neu2.txt schreiben. Wenn ich z.B. Zeilen 2-4 herausfiltern, sollten also 3 Zeilen drin sind. Aber die Ausgabe ist völlig wirr. Bei jedem Schleifendurchlauf wird die Dateiausgabe größer , manchmal werden Zeilen gekoppelt, manchmal welche weggelassen. Sorry, ich kann es selber nicht genauer beschreiben, weil die Ausgabe für mich nicht nachvollziehbar ist.

Und das Lustige: ich habe zum Testen mal eine Datei angelegt mit Zehen Zeilen. Und da speichert er gar nichts ab.

Klingt verrückt, aber ich kann es nicht besser beschreiben. Vielleicht hat jemand eine Idee. Danke und frohe Ostern.

Bearbeitet von Thomas_Do:

Tippfehler im Titel korrigiert.

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 131

Hallo,

beschreibe doch mal genau was du willst. Du möchtest Zeilennummern angeben und diese Zeilen aus der einen Datei extrahieren und in eine andere Datei schreiben, richtig? Wie sieht der Inhalt der auszuwertenden Datei aus (also wie sind die Daten aufgebaut)?

Gruß

Carsten

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Also es geht, wie du richtig vermutest, darum, Suchergebnisse, die weiter oben im Skript gefunden wurden, zu bearbeiten. In der Funktion, an der ich gerade bastle, soll der Nutzer verschiedene Zeilen angeben können, die dann im Suxhergebnis behalten werden.

Ich hoffe, ich habe das nicht zu kompliziert ausgedrückt.

Bin gerade noch unterwegs, kann dir nachher gerne mal das Gesamte Skript posten.

Danke dir aber für die Hilfe schonmal

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Hallo Wolfmann,

aus deinen verbalen Ausführungen konnte ich leider nicht feststellen, was du wirklich willst. Es würde helfen, wenn du eine Beispieldatei bereit stellst, deine Eingaben mitteilst und das erwartete Ergebnis zeigen würdest. Aus deinem Script habe ich eine Vermutung, die ich mal wie folgt interpretiere:

$ # Erstelle Datei neu.txt
$ echo -e "eins\nzwei\ndrei\nvier\nfünf\nsechs\nsieben\nacht\nneun\nzehn\nelf\nzwölf\ndreizehn\nvierzehn" >neu.txt
$ # Zeige Zeile 2, 4 und 6-8 sowie 10 und 12-13
$ lines_to_keep="2,4,6-8,10,12-13"
$ # mach aus dem lines_to_keep ein sed Befehl
$ cmd=$(sed 's/,/p;/g;s/-/,/g' <<<"$lines_to_keep,")
$ echo $cmd
2p;4p;6,8p;10p;12,13p;
$ # Zeige die gewünschten Zeilen
$ sed -n "$cmd" neu.txt
zwei
vier
sechs
sieben
acht
zehn
zwölf
dreizehn
$ 

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Hallo @shiro

Also das Programm ist ein Programm zum editieren meiner iptv-Tv (m3u) Liste. Es wird zunächst eine Liste ausgewählt, aus der der Benutzer dann nach Begriffen suchen kann. Die Ergebnisse sehen dann eben aus wie in einer m3u Liste. In unten stehendem Beispiel habe ich mal in einer deutschen Liste nach "zdf hd" gesucht.

1  #EXTINF:-1 ZDF HD
     2  --stream-url
     3  #EXTINF:-1 group-title="DE",ZDF HD DE
     4  --stream-url
     5  #EXTINF:-1 group-title="DE",zdf_neo HD
     6  --stream-url
     7  #EXTINF:-1 group-title="DE",ZDFinfo HD
     8  --stream-url

Im Anschluss kann man mit den Suchergebnissen, die in der Datei neu.txt gespeichert werden, Folgendes machen:

1.) Direkt in der Gesamtliste speichern 2.) Verwerfen 3.) Zeilen, die man doch nicht braucht löschen und 4.) (das woran ich gerade arbeite, der Rest funktioniert schon): verschiedene Zeilen behalten

Die Ergebnisse dieser Bearbeitungen werden dann wieder in die neu.txt geschrieben. Und am Ende, wenn alles passt, kann man es, wie gesagt, in der Gesamtliste speichern.

Hoffe, ich konnte es ein bisschen erklären. Melde dich gerne bei weiteren Nachfragen.

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Aha, dann also erweiterte m3u mit 2 Zeilen. Ich habe daher ein kleines Script m3u.sh unten eingefügt und mit einer veralteten Datei (kn-kodi-tv.m3u) mal getestet, was ich mir vorstelle, was du machen willst.

$ cat >m3u.sh <<**EOF**
#!/bin/bash
such="\$1"
m3u=\${2:-~/Downloads/kn-kodi-tv.m3u}
ziel=\${3:-neu.txt}
# erstelle temporäre Datei \$\$
sed -z 's/\r*\n/\x00/g;s/#EXTINF/\n#EXTINF/g' \$m3u | tee \$\$ | 
 sed 's/\x00.*\$//;s/:.*,/ /' | 
 nl -ba | grep -i "\$such"
read -p "Welche Zeilen sollen behalten werden: " lines2keep
[ -n "\$lines2keep" ] && sed -n \$(sed 's/,/p;/g;s/-/,/g' <<<"\$lines2keep,") \$\$ | 
 sed 's/\x00/\r\n/g' >>\$ziel
[ -e \$ziel ] && sed -i '1 {s/^#EXTM3U/&/;te;s/^/#EXTM3U\r\n/;:e}' \$ziel
[ -e \$\$ ] && rm \$\$
**EOF**
$ 
$ [ -e neu.txt ] && rm neu.txt
$ . m3u.sh zdf
     4	#EXTINF ZDF HD
    11	#EXTINF ZDFneo
    12	#EXTINF ZDFinfo
   102	#EXTINF ZDF Event 1
   103	#EXTINF ZDF Event 2
   104	#EXTINF ZDF Event 3
   105	#EXTINF ZDF Event 4
   106	#EXTINF ZDF Event 5
   107	#EXTINF ZDF Event 6
Welche Zeilen sollen behalten werden: 4,11,12
$ . m3u.sh ard
     9	#EXTINF ARD-alpha
   100	#EXTINF ARD Event 1
   101	#EXTINF ARD Event 2
Welche Zeilen sollen behalten werden: 9,100-101
$ cat neu.txt 
#EXTM3U
#EXTINF:-1 tvg-name="ZDF HD" tvg-id="ZDF.de" group-title="Vollprogramm" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/zdfhd.png",ZDF HD
https://zdf1314-lh.akamaihd.net/i/de14_v1@392878/index_3096_av-b.m3u8

#EXTINF:-1 tvg-name="ZDFneo" tvg-id="ZDFneo.de" group-title="Spartenprogramm" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/zdfneo.png",ZDFneo
https://zdf1314-lh.akamaihd.net/i/de13_v1@392877/index_3096_av-b.m3u8

#EXTINF:-1 tvg-name="ZDFinfo" tvg-id="ZDFinfo.de" group-title="Spartenprogramm" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/zdfinfo.png",ZDFinfo
http://zdf1112-lh.akamaihd.net/i/de12_v1@392882/index_3096_av-p.m3u8

#EXTINF:-1 tvg-name="ARD-alpha" tvg-id="ARD-alpha.de" group-title="Spartenprogramm" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/ardalpha.png",ARD-alpha
https://brlive-lh.akamaihd.net/i/bralpha_germany@119899/index_3776_av-p.m3u8

#EXTINF:-1 tvg-name="ARD Event 1" tvg-id="ARDEvent1.de" group-title="Extra" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/daserste.png",ARD Event 1
http://wdr_ardevent1-lh.akamaihd.net/i/wdrardevent1_weltweit@112049/index_1_av-p.m3u8

#EXTINF:-1 tvg-name="ARD Event 2" tvg-id="ARDEvent2.de" group-title="Extra" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/daserste.png",ARD Event 2
http://wdr_ardevent2-lh.akamaihd.net/i/wdrardevent2_geogeblockt@112050/index_1_av-p.m3u8

$ 

Meinst du diese oder eine ähnliche Vorgehensweise?

Sollten Schritte im Script nicht sofort verständlich sein, lass es mich wissen, damit ich es erklären kann.

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Entschuldige meine späte Rückmeldung. Ich hatte in meiner sed Anweisung einen kleinen Syntaxfehler - jetzt läuft.

Dennoch sieht dein Ansatz auch sehr interessant aus. Könntest du mir die wesentlichen Punkte nochmal kurz erläutern? Denn lernen kann man ja immer.

Vielen Dank dir für deine Bemühungen

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4650

Wohnort: Berlin

@Wolfmann: Für jede einzelne Zeile sed anwerfen und die Eingabedatei erneut verarbeiten finde ich ja leicht pervers. Es wäre effizienter einfach die Eingabedatei in der Bash in ein Array einzulesen und dann die Zeilen von dort aus in eine Datei zu schreiben. Wenn am Ende die originale Datei überschrieben werden soll, kann man das dann auch ohne temporäre Datei machen, denn der Dateiinhalt ist ja im RAM.

Also etwas in dieser Richtung (ungetestet):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
                        filename=neu.txt                        
                        readarray lines < "$filename"
                        read -r -p "Welche Zeilen sollen behalten werden" lines_to_keep
                        IFS=',' read -ra hold_lines_tokens <<< "$lines_to_keep"
                        for token in "${hold_lines_tokens[@]}"; do
                                IFS=- read -r start end <<< "$token"
                                [[ -z $end ]] && end=$start
                                if [[ $start -gt $end ]]; then
                                        echo "Fehler: $start>$end"
                                else
                                        : > "$filename"
                                        for (( i = start - 1; i < end; i++ )); do
                                                echo "${lines[i]}" >> "$filename"
                                        done
                                fi
                        done

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Ja, es gibt sicherlich Wege, die wesentlich effektiver sind als meiner. Ich beschäftige mich allerdings erst seit ein paar Tage mit Shellskript-Programmierung.

Ich habe mal deinen Ansatz angesehen und versuche das mal zu rekonstruieren:

Zuerst hast du die zu bearbeitenden Textdatei in das array links eingelesen. (Kann man statt read -ra <<<arrayname dann wohl auch readarray < schreiben). Nachdem die Zeilenbereiche durch ein Komma seperiert und in ein Array eingelesen wurden, hast du in der for-Schleife den IFS auf ein "-" gesetzt (glaube da hast du die ' vergeseen). Und die Werte hast du dann gleich in start und end gespeichert.

Was die Zeile drunter bedeuten soll, erschließt sich mir noch nicht so ganz^^

Dann weiter unten hast du die Datei in der Variable als Ausgabemedium gewählt (könnte man das >$filename auch an das done am Schleifenende anhängen? )

Soweit habe ich das erstmal verstanden.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4650

Wohnort: Berlin

read -ra und readarray kann man nicht einfach so ersetzen. Sonst bräuchte es ja readarray nicht wenn das einfach nur ein Alias für read -ra wäre.

Die ' beim IFS sind beim - (und auch beim ,) nicht notwendig. Kann man machen, muss man aber nicht.

$ A=-
$ B='-'
$ printf ">%s<\n" "$A" "$B"
>-<
>-<

Mit && verkettet man Befehle wo der zweite nur ausgeführt wird wenn der erste 0 als Rückgabecode geliefert hat. Das heisst $end wird der Wert von $start zugewiesen wenn $end leer ist. Das passiert wenn man nur eine Zahl statt einem Zahlbereich mit - angibt.

$ IFS=- read -r start end <<< "23-42"
$ echo ">$start< >$end<"
>23< >42<
$ [[ -z $end ]] && echo "end ist leer"
$ IFS=- read -r start end <<< "23"
$ echo ">$start< >$end<"
>23< ><
$ [[ -z $end ]] && echo "end ist leer"
end ist leer

Stimmt, man könnte die Ausgabe der for-Schleife in die Datei umleiten — das macht den Code etwas einfacher.

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Ok, danke für deinen hilfreichen Input. Dann werde ich mich gleich mal dransetzen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

Ich habe mir das noch mal in Ruhe angeschaut: eigentlich willst Du ein recht komplexes Eingabemuster parsen. Ich meine damit die Komma-getrennte Liste von Zeilennummern oder Bereichen. Das würde ich eher nicht in der Shell machen - da gibt es besser geeignete Sprachen. Aus Spaß habe ich das mal in Ruby gemacht, was den Vorteil hat, Reguläre Ausdrücke als nativen Datentypen zu unterstützen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/ruby

require 'set'
lines = Set.new

print "Enter ranges: "
ranges = gets.chomp

if /\A(?:\d+(?:-\d+)?)(?:,\d+(?:-\d+)?)*\z/ =~ ranges
  ranges.split(',').each do |range_or_line|
    if /\A(\d+)(?:-(\d+))?\z/ =~ range_or_line
      first = Integer($1)

      if $2
        second = Integer($2)
        abort "ERROR: range error: #{range_or_line}" unless second > first
        lines.merge(first..second)
      else
        lines << first
      end
    else
      abort "FATAL: unexpected"
    end
  end
else
  abort "ERROR: input does not match expected pattern: #{ranges}"
end

File.open 'neu.txt', 'r' do |inp|
  File.open 'tmp', 'w' do |out|
    inp.each do |line|
      if lines.include?(inp.lineno)
        puts "Dateianzeige #{line}"
        out.puts line
      end
    end
  end
end

File.rename 'tmp', 'neu.txt'

Man sieht an dem Regex für die gesamte Eingabe, dass das ein wenig knifflig ist. ☺

PS: übrigens fand ich das seltsam, dass der nl bei jedem Schleifendurchlauf aufgerufen wurde. Ich nehme an, das ist nur zu Debug-Zwecken.

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Könntest du mir die wesentlichen Punkte nochmal kurz erläutern?

Klar, kein Problem.

Vorabinfo: Eine extended m3u Datei hat mehrere Zeilen, die durch CR-LF (\r\n) beendet werden um kompatibel zu Microsoft zu sein. Die erste Zeile enthält am Anfang den String "#EXTINF:" gefolgt von einigen Variablenbeschreibungen (z.B. Logo-Ort), einem Komma und der Beschreibung des Eintrags. Dann folgt eventuell in mehreren Zeilen der Media-Link. Um diesen Block zusammen zu halten, werden die Zeilenenden (ev.CR und LF) in ein NUL Character (\x00) gewandelt und in einer temporären Datei ($$) abgelegt. Damit der Bediener nicht mit den Variablendefinitionen hinter "#EXTINF" erschlagen wird, werden diese zur Anzeige kurz gelöscht und die m3u Einträge nummeriert (nl).

Aber im Detail:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
such="$1"
m3u=${2:-~/Downloads/kn-kodi-tv.m3u}
ziel=${3:-neu.txt}
# erstelle temporäre Datei $$
sed -z 's/\r*\n/\x00/g;s/#EXTINF/\n&/g' $m3u | tee $$ | 
 sed 's/\x00.*$//;s/:.*,/ /' | 
 nl -ba | grep -i "$such"
read -p "Welche Zeilen sollen behalten werden: " lines2keep
[ -n "$lines2keep" ] && sed -n $(sed 's/,/p;/g;s/-/,/g' <<<"$lines2keep,") $$ | 
 sed 's/\x00/\r\n/g' >>$ziel
[ -e $ziel ] && sed -i '1 {s/^#EXTM3U/&/;te;s/^/#EXTM3U\r\n/;:e}' $ziel
[ -e $$ ] && rm $$
  • zu Zeile 3-4: Wenn die Parameter 2 und 3 nicht angegeben sind, werden Default-Werte (hinter ":-") eingetragen.

  • zu Zeile 6-8: Die gesamte Datei wird als eine Zeile (-z) eingelesen und die Zeilenenden mit eventuellem CR (\r*\n) zu einem NUL Character (\x00) geändert. Damit man wieder NL terminierte Zeilen hat, in denen nach "$such" per "grep" gesucht werden kann, wird vor der "#EXTINF" Token ein NL (\n) gesetzt. Diese Zeilen werden in der Datei $$ (PID) zwischengespeichert (tee) und für die Anzeige aufbereitet. Hierzu wird alles nach der ersten Zeile (\x00) gelöscht und der Text zwischen ":" und dem "," durch ein Blank (" ") ersetzt, eine Zeilennummer davor geschrieben (nl -ba) und dem Benutzer angezeigt.

  • zu Zeile 9: In die Variable "lines2keep" trägt der Benutzer die zu merkenden Zeilen durch Komma getrennt ein. Bei Bereichen trägt er die von-bis Zeilen durch Minus (-) getrennt ein.

  • zu Zeile 10-11: Wurde etwas eingegeben ([ -n), so wird die Eingabezeile (lines2keep) in eine Befehlszeile für "sed" geändert. Ein Komma wird daher zum Befehl "p" mit dem Trennzeichen ";" (also "p;"). Einen Bereich notiert man bei "sed" mit einem Komma (,). Daher wird das "-" in ein "," geändert. Sollte der Bereich das letzte Element der Eingabe sein, wird ein Komma zugefügt (<<<"$lines2keep,"). Aus der Eingabe "2,4,6-8" wird somit der "sed" Befehl "2p;4p;6,8p;" um die zweite, vierte und sechste bis achte "Zeile" zu extrahieren. Die so über "sed -n" ausgegebenen "Zeilen" (Blöcke) aus "$$" erhalten ihre Zeilenenden (\x00 → \r\n) zurück und werden an die Datei "$ziel" angehängt.

  • zu Zeile 12: Bei einer extended m3u Datei muss in der ersten Zeile der Token "#EXTM3U" stehen. Sollte er nicht in der ersten Zeile stehen (1{...}), wird am Zeilenanfang (^) nach "#EXTM3U" gesucht und durch den gefundenen Text ersetzt (&). Wurde diese Ersetzung erfolgreich durchgeführt (t), geht es bei Label "e" weiter (daher "te"). Wurde die Zeichenkette nicht gefunden, wird am Anfang (^) die Zeichenkette "#EXT3MU\r\n" mit Zeilenende eingefügt. Danach kommt die Definition des Labels ":e". Damit hierbei nicht mit temporären Zwischendateien gearbeitet werden muss, erfolgt diese Operation "in-place" (sed -i).

  • Zu Zeile 13: Sollte die Datei $$ existieren, wird sie gelöscht.

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 343

Danke dir erstmal für deine ausführliche Erläuterung. Echt super, dass du dir die Mühe gemacht hast.

Ab Zeile 9 vestehe ich es auch soweit. Allerdings ist mir noch nicht klar, was oben die Parameter 2 und 3 bewirken und wie sich der Ausdruck hinter sed (Zeilen 6 bis 8 ) zusammensetzt.

Viele Grüße

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Allerdings ist mir noch nicht klar, was oben die Parameter 2 und 3 bewirken ...

Das Script "m3u.sh" verarbeitet 3 Parameter. Beispiel eines Aufrufs:

  • $ . m3u.sh Suchbegriff Quelldatei.m3u Zieldatei.m3u

Wird der 2. Parameter (Quelldatei.m3u) beim Aufruf weg gelassen, wird als Defaultwert die Zeichenkette verwendet, die hinter dem ":-" Trennzeichen steht. Das Gleiche gilt für den 3. Parameter. Ist der nicht angegeben, wird als Ziel die Datei "neu.txt" verwendet. Du kannst also aus unterschiedlichen Quellen deine Zieldatei befüllen, wenn du als Parameter 2 ($2) eine Datei angibst.

... und wie sich der Ausdruck hinter sed (Zeilen 6 bis 8 ) zusammensetzt.

In Zeile 6 wird die Quelldatei ($m3u) durch "sed -z" in "einem Rutsch" gelesen, da als "Zeilenende" ein NUL-Character erwartet wird. Bei den m3u Dateien ist das Zeilenende ein NL Character (\n) mit eventuellem CR (bei Microsoft CR-NL). Dann arbeitet "sed" zwei "s" Befehle ab.

  • s/\r*\n/\x00/g → Alle Zeilenenden der Datei, die entweder ein CR-NL (\r\n) oder nur ein NL (\n) aufweisen werden zu einem NUL-Character (\x00) geändert, da der "s" Befehl mit einem "g" abgeschlossen wird. Hierdurch werden alle Zeilen eines M3U Eintrags zu einer Zeile zusammen gefasst.

  • s/#EXTINF/\n&/g → Damit man bei der Suche mit "grep" wieder zeilenbasiert Ergebnisse finden kann, muss man den erzeugten Stream wieder in Zeilenform bringen. Eine neue Zeile beginnt mit dem "#EXTINF" Eintrag. Daher wird vor diesen Token ein NL (\n) gesetzt. Das "&" repräsentiert die zuvor gefundene Zeichenkette (also den Token).

Der Befehl "tee" schreibt den Inhalt der Pipe in die Datei $$ (das ist die PID des Jobs und sollte für die genutzte Zeitdauer eindeutig sein). Den in die Datei geschriebenen Inhalt gibt "tee" auch auf "/dev/stdout" aus und kann in der Pipe vom folgenden Befehl weiter verarbeitet werden.

In Zeile 7 und 8 erfolgt die Aufbereitung des gelesenen M3U Blocks zur Darstellung für den Benutzer. Alle Zeilen des Blocks (getrennt durch ein NUL Character) werden bis auf die erste Zeile gelöscht (s/\x00.*$//). Bei der verbleibenden 1. Zeile wird der Text hinter "#EXTINF" bis zum Komma "," gelöscht (s/:.*,/ /) bzw durch ein Blank ersetzt, um nicht zu viele unnötige Informationen dem Benutzer zu präsentieren. Wenn du dies nicht willst, sondern nur das "tvg-logo" beseitigen willst, kannst du statt (s/:.*,/ /) auch (s/tvg-logo="[^"]*"//) schreiben. Die so erzeugten Zeilen werden mit einer Zeilennummer (nl) versehen und an die Suche durch "grep" übergeben.

Wenn dich bei der Ausgabe des Inhalts in die Datei "$ziel" das noch immer existierende NL (Leerzeile) vor dem "#EXTINF" stört, kannst du dies in Zeile 11 korrigieren.

  • statt: → s/\x00/\r\n/g

  • auch: → s/\n//g;s/\x00/\r\n/g

Du siehst, dass du das Verhalten des Scripts deinem Bedarf leicht anpassen kannst.

Antworten |