staging.inyokaproject.org

Inhalt einer Datei als neuen Dateinamen setzen, zweite Zeile als Inhalt der neuen Datei setzen

Status: Gelöst | Ubuntu-Version: Server 20.04 (Focal Fossa)
Antworten |

HamburgJoe

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Moin Moin,

hänge mal wieder fest.

Ich habe eine Datei. In dieser befindet sich in einer Zeile ein eindeutiger Name. Zum Beispiel "Sonnenuntergang". In der zweiten Zeile befindet sich ein Link.

Ziel soll es sein, dass der Name Sonnenuntergang den Dateinamen der neu erstellten Datei haben soll. In der nächsten Zeile steht ein Link. Dieser soll den Inhalt der eben gebildeten neuen Datei ergeben. Ich habe gedacht ich kann das mit SED lösen, stehe aber auf dem Schlauch, beziehungsweise habe schlichtweg nur gefährliches Halbwissen. 😉

Aufbau der Datei ist wie folgt (es gibt mehr Einträge, als nur diese drei):

Sonnenuntergang
https://irgendwas1.com
Meer
https://irgendwas2.com
See
https://irgendwas3.com

Wie kann ich das Problem am besten angehen?

Über Eure Hilfe würde ich mich sehr freuen. Vielen Dank vorab!

Beste Grüße

Joe

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dateinamen der Datendatei als erstes Argument beim Aufruf übergeben.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sh

[ -z "$DEBUG" ] || set -x

while read -r line; do
  case "$line" in
  http*) curl --silent "$line" > "$name" ;;
  *) name="$line" ;;
  esac
done < "$1"

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

rklm schrieb:

Dateinamen der Datendatei als erstes Argument beim Aufruf übergeben.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sh

[ -z "$DEBUG" ] || set -x

while read -r line; do
  case "$line" in
  http*) curl --silent "$line" > "$name" ;;
  *) name="$line" ;;
  esac
done < "$1"

Moin, vielen Dank für Deine Hilfe. Aber damit kann ich leider nichts anfangen. Denn ich verstehe nicht was das Script macht. ☹ Wenn ich es so ausführe (was vermutlich/offensichtlich falsch ist), erhalte ich die Fehlermeldung: "./script_test.sh: Zeile 8: : Datei oder Verzeichnis nicht gefunden"

Ich habe das Script mal "script_test.sh" genannt.

Würdest Du bitte ein bisschen Licht in mein Dunkel bringen?

Danke und beste Grüße

Joe ☺

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Wer lesen kann ist klar im Vorteil.

Das Script läuft und tut was es soll.

Vielen Dank! ☺

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

HamburgJoe schrieb:

Wer lesen kann ist klar im Vorteil.

😀

Das Script läuft und tut was es soll.

Fein.

Vielen Dank! ☺

Danichfür. Brauchst Du noch Erläuterungen?

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Ja, bitte. Es macht nämlich doch nicht so ganz was es soll.

Muss mir das Ergebnis mal eben anschauen und gucken was mir da die Daten zerhaut.

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Also, so Eindeutig wie ich dachte sind die Namen wohl doch nicht. Teilweise sieht der Original Dateiinhalt so aus:

Wort AnderesWort - 2033 - 6.3
https://irgendwas.com
NeuesWort UndWiederWasAnderes - 2055 - 6.3 -
https://irgendwasanderes.com

Teilweise stehen hinten an, Zahlen und/oder Bindestriche, wie oben zu sehen ist.

Außerdem sind die erstellten Dateien leer und haben folgende Endung:

'Wort AnderesWort$'\r'

Hinzukommt, dass ich nicht weiß wo in dem Script ich die Dateiendung *.txt vergeben kann.

Ich bin also doch wieder ein bisschen lost. 😉

Über Eure Hilfe würde ich mich sehr freuen.

Danke und beste Grüße

Joe

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

HamburgJoe schrieb:

Also, so Eindeutig wie ich dachte sind die Namen wohl doch nicht. Teilweise sieht der Original Dateiinhalt so aus:

Wort AnderesWort - 2033 - 6.3
https://irgendwas.com
NeuesWort UndWiederWasAnderes - 2055 - 6.3 -
https://irgendwasanderes.com

Teilweise stehen hinten an, Zahlen und/oder Bindestriche, wie oben zu sehen ist.

Und was davon soll im Dateinamen landen?

Außerdem sind die erstellten Dateien leer und haben folgende Endung:

'Wort AnderesWort$'\r'

Dann hat deine Datei mit den Namen und URLs wohl Zeilenenden im Windows-Stil ('\r\n').

Hinzukommt, dass ich nicht weiß wo in dem Script ich die Dateiendung *.txt vergeben kann.

Was soll die Endung erhalten? Die Dateien, in denen die heruntergeladenen Daten gespeichert werden?

Man könnte z.B. sowas auch mit python3 machen (benötigt das Paket python3-requests) - als ausführbar gemachte dl.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
import fileinput
import requests
import sys

headers = {  # be nice to wikimedia: https://meta.wikimedia.org/wiki/User-Agent_policy
    'User-Agent': 'My User Agent/1.0',
    'From': 'youremail@example.com'
}

line_gen = fileinput.input()

for filename, url in zip(line_gen, line_gen):
    r = requests.get(url.rstrip(), headers=headers)
    try:
        r.raise_for_status()
    except requests.HTTPError as e:
        print(e, file=sys.stderr)
    else:
        with open(filename.rstrip(), 'wb') as f:
            f.write(r.content)

mit so einer data.txt:

Sonnenuntergang
https://upload.wikimedia.org/wikipedia/commons/6/6c/Corp2739.jpg
See
https://upload.wikimedia.org/wikipedia/commons/9/94/Vierwaldstaettersee.jpg
Meer
https://upload.wikimedia.org/wikipedia/commons/6/69/Madeira_k%C3%BCste.jpg

kann ich das so aufrufen:

./dl.py data.txt 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Was ich noch nicht verstehe:

Sollen alle https-Links in eine Datei die den Namen der vorigen Zeile hat gespeichert werden, also im ersten Beispiel Meer, See usw. (wieso .txt und nicht .html?) oder soll der allwissende User genau einen Namen als Argument übergeben, also Meer, See, "NeuesWort UndWiederWasAnderes - 2055 - 6.3 -"?

Wort AnderesWort - 2033 - 6.3
https://irgendwas.com
NeuesWort UndWiederWasAnderes - 2055 - 6.3 -
https://irgendwasanderes.com

Dem Hinweis auf Windowszeilenenden schließe ich mich vollumfänglich an. ☺

Angenommen der User weiß, wonach er sucht, und sucht nach einem Schlüsselwort:

1
2
3
4
5
6
sed -n "/See/{n; p}" urlaub.html > See.txt
#
# besser für Massenverarbeitung geeignet: 
key=See; sed -n "/$key/{n; p}" urlaub.html > $key.txt
# Mit Leerzeichenvorsicht: 
key="Zoll am See"; sed -n "/$key/{n; p}" urlaub.html > "$key".txt

Wenn man einen Text sucht, der auch Teil eines längeren Textes ist, aber man will auf ganze Wörter matchen:

1
2
3
4
5
6
7
8
echo -e "Seefeld\nhttps://irgendwas4.com" >> urlaub.html 
sed -n "/\bSee\b/{n; p}" urlaub.html 
# -n gibt per Default nichts aus, {n; p} sagt, dass die nächste Zeile gelesen werden soll
# und dann ausnahmsweise doch geprinted wird.
# findet Seefeld nicht, da /bSee/b auf Wortgrenzen (Wordboundaries) matcht. 
echo -e "Zoll am See\nhttps://irgendwas4.com" >> urlaub.html 
sed -n "/^See$/{n; p}" urlaub.html 
# findet auch "Zoll am See" nicht, da auf ganze Zeilen gematcht wird.

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Moin an alle,

erstmal danke für Eure Hilfe.

Um vielleicht ein bisschen Licht ins Dunkel zu bringen, es handelt sich bei der Originaldatei um eine m3u.

In dieser befindet sich in Zeile 1 ein Filmtitel, in Zeile 2 der Link zum Filmtitel. Nein nichts illegales, kein Kino.to, oder wie die Seiten heißen, oder hießen.

Die Datei ist so aufgebaut (die ganzen Sonderzeichen habe ich bereits per sed entfernt):

Filmtitel1
https://irgendwas1.com
Filmtitel2
https://irgendwas2.com
Filmtitel3
https://irgendwas3.com
Filmtitel4
https://irgendwas4.com
...

Es soll nun je Titel eine neue Datei mit der Endung *.strm erstellt werden. Inhalt der Datei soll dann nur der eine entsprechende Link sein.

Quasi so:

Filmtitel1.strm Einziger Inhalt der Datei ist dann https://irgendwas1.com'' - Filmtitel2.strm nur mit dem Inhalt https://irgendwas2.com'' und so weiter...

Die Quell m3u ist mit meinem eigenem Content gefüllt. Ich tue hier also nichts illegales und würde mich über Eure Hilfe freuen.

Danke und beste Grüße

Joe

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Ohne Anspruch auf Vollkommenheit ...

1
for line in $(fgrep "http" quell.m3u);do titel=$(cat quell.m3u | grep $line -B1 | grep -v $line);echo $line | tee $titel.strm;done

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

1
2
3
4
5
while read title 
do 
  read url 
  echo $url > $title 
done < sample.m3u

Das liest eine Zeile, den (Datei/Medien)-Titel, liest die Url, gibt die Url in eine Datei mit dem Titel aus und das, solange Zeilen nachkommen, und liest aus der Datei sample.m3u.

Wenn die Zieldatei title.txt heißen soll, dann lenke es nach $title.txt um. Bereits oben gesagtes zu Leerzeichen in Titelnamen gilt auch hier.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
t530:~/proj/mini/forum 🐧> l Filmtitel*
-rw-rw-r-- 1 stefan stefan 23 Apr  6 04:54 Filmtitel1
-rw-rw-r-- 1 stefan stefan 23 Apr  6 04:54 Filmtitel2
-rw-rw-r-- 1 stefan stefan 23 Apr  6 04:54 Filmtitel3
-rw-rw-r-- 1 stefan stefan 23 Apr  6 04:54 Filmtitel4
t530:~/proj/mini/forum 🐧> cat Filmtitel*
https://irgendwas1.com
https://irgendwas2.com
https://irgendwas3.com
https://irgendwas4.com

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Moin an alle!

Als erstes 1000 Dank an Euch. Es hat nun alles geklappt.

Habe mir noch das Tool dos2unix geladen und die Sourcefile entsprechend bearbeitet.

Jetzt läuft es, wie ich es mir vorgestellt habe.

Besten Dank an alle! ☺

Joe

Antworten |