it-swarm.com.de

Text aus einer Datei extrahieren und die Zeile in eine Datei ausgeben

Nach der Verwendung von grep für eine HTML-Datei erhalte ich die folgende Ausgabe:

      <div id="v3060000-3062005" class="BLAH...>
      <div id="v50001027-50002018" class="BLAH...>
      <div id="v907200-907202" class="BLAH...>
      <div id="v20024011-20024012" class="BLAH...>

Ich muss die Zeichenfolgen von Zahlen aus den obigen Zeilen extrahieren und sie zu einer URL kombinieren, wie zum Beispiel:

http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3

Kann ich wissen, wie ich das mit einem Shell-Skript machen kann?

5
kilion

Normalerweise würde ich raten, dass Sie einen richtigen HTML-Parser verwenden, um HTML zu analysieren.

Diese Daten sehen jedoch recht einfach aus: Verwenden Sie ein doppeltes Anführungszeichen (optional gefolgt von "v") als Feldtrennzeichen und greifen Sie auf das zweite Feld jeder Zeile zu. Dann verbinden Sie die Stücke mit Kommas

result=$( grep ... file.html | awk -F'"v?' '{print $2}' | paste -sd, )
echo "http://x.y.z/$result.mp3"
6
glenn jackman

Angenommen, Sie haben die Eingabedaten Ihrer Frage in einer Datei mit dem Namen data.txt gespeichert, können Sie diesen Befehl verwenden, um die URL zu generieren:

grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'

Hier ist ein Beispiellauf:

$ grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3

Was es macht:

  • grep -Po '\d+-\d+' data.txt extrahiert alle NUMBER-NUMBER Sequenzen aus Ihren Daten, z. B. 3060000-3062005, und gibt eine Sequenz pro Zeile aus.
  • tr '\n' ',' konvertiert alle Zeilenvorschubzeichen seiner Eingabe in Kommas, wodurch die Zeilen effektiv miteinander verbunden werden.
  • sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/' entfernt das nachgestellte Komma aus seiner Eingabe und bettet es in die Zeichenfolge http://x.y.z/\1.mp3 ein, wobei \1 ersetzt wird. Beachten Sie, dass alle Schrägstriche in der Zeichenfolge mit einem Backslash versehen werden müssen.
5
Byte Commander

Mit awk:

... | awk -F'"' '{part=part substr($2,2) ","} \
                  END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}'
  • -F'"' setzt das Feldtrennzeichen als "

  • part=part substr($2,2) ","} ruft das zweite Feld ab, und substr($2,2) entfernt das Start-Feld v aus dem String, und das Ergebnis wird durch Hinzufügen eines abschließenden , als Variable part gespeichert.

  • END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"} chunk wird ausgeführt, nachdem alle Datensätze analysiert wurden. Hier wird der letzte , aus der Variablen part entfernt und die gewünschte formatierte Ausgabe gedruckt

Beispiel:

% cat file.txt
      <div id="v3060000-3062005" class="BLAH...>
      <div id="v50001027-50002018" class="BLAH...>
      <div id="v907200-907202" class="BLAH...>
      <div id="v20024011-20024012" class="BLAH...>

% awk -F'"' '{part=part substr($2,2) ","} END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}' file.txt
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3
4
heemayl

Zunächst müssen Sie herausfinden, wie Sie den auszugebenden Text erhalten. Da andere Antworten dies zeigen, muss ich diese Informationen nicht in meine Antwort aufnehmen.

Ich werde mich jedoch mit der Ausgabe dieser Informationen in eine Datei befassen.

Fügen Sie dazu nach Ihrem Befehl > filename ein. Dadurch wird der Inhalt der Datei mit der Standardausgabe (stdout) des verwendeten Befehls überschrieben (sofern nicht vorhanden).

Eine alternative Methode besteht darin, >> anstelle von > zu verwenden, um den Text stattdessen an eine Datei anzuhängen, anstatt ihn zu überschreiben.

0
Dev