it-swarm.com.de

Extrahieren einer bestimmten Zeichenfolge nach einer bestimmten Zeichenfolge aus einer HTML-Datei mithilfe eines Bash-Skripts

Ich habe eine HTML-Datei momcpy.html, aus der ich nach einer bestimmten Zeichenfolge eine bestimmte Zeichenfolge extrahieren möchte. Dateiinhalt ist wie folgt:

<tr><br>
<th height="12" bgcolor="#808080"><label for="<br>
 LSCRM:Abhijeet<br>
 <br>
 MCRM:Bhargav<br>
 <br>
 TLGAPI:GAURAVAURAV<br>
 <br>
 MOM:MANIKA"></td><br>

Dies steht in einer der HTML-Zeilen.

Ich möchte Manika extrahieren und in einer Variablen speichern. Grundsätzlich möchte ich die Zeichenfolge extrahieren, die nach MOM: vorhanden ist. Sie könnte dynamisch sein.

Ich habe versucht:

file='/home/websphe/Tomcat/webapps/MOM/web/momcpy.html'
  y=$( awk '$1=="MOM:"{print $2}' $file)
 echo "$y"

Aber das hat nicht funktioniert.

5
Abhijeet Anand

Ich kann dies nicht sinnvoll empfehlen, weil das Parsen von HTML mit Regex wird wahrscheinlich nicht gut enden aber Sie könnten in der Lage sein, den String MANIKA mit zu bekommen

sed -nr '/MOM:/ s/.*MOM:([^"]+).*/\1/p' file

Es funktioniert auf jeden Fall OK für Ihre Probe ...

Anmerkungen

  • -n drucke nichts, bis wir danach fragen
  • -r benutze ERE
  • /string/ finde Zeilen mit string
  • s/old/new/ ersetze old durch new
  • .* beliebig viele beliebige Zeichen
  • ([^"]+) speichere einige Zeichen, die nicht " sind
  • \1 Rückverweis auf gespeicherte Zeichen
  • p druckt nur die Zeilen, die wir geändert haben
7
Zanna
grep -Po 'MOM:\K[^"]+' file.html

Warnung: Dies ist keine sehr robuste Lösung. Und dein HTML ist ungültig

5
user216043

Die Zeichenfolge, nach der Sie suchen, hat immer MOM: davor, aber Sie haben nicht gesagt, ob immer " dahinter steht. Zum Zweck dieser Antwort gehe ich davon aus, dass Sie nach Zeichenfolgen suchen, die Groß- oder Kleinbuchstaben, Ziffern oder Unterstriche enthalten dürfen. Diese werden in der Terminologie von reguläre Ausdrücke als Wortzeichen bezeichnet. Das Abgleichen solcher "Wörter" von Text ist nützlich genug, damit die meisten Dialekte regulärer Ausdrücke Funktionen haben, die dies unterstützen. Wenn Sie dies nicht möchten, können Sie diese Lösung entsprechend ändern oder die Techniken in den anderen Antworten verwenden.

Ich gebe David Foersters , Zannas und JJoaos weise Warnungen über das Parsen von HTML mit Regex und darüber, dass dies nicht robust ist. Bitte seien Sie vorsichtig und überlegen Sie, ob das, was Sie angefordert haben, wirklich genau das ist, was Sie tun möchten. In Ihrem Beispielcode haben Sie den Pfad zur Eingabedatei der Variablen $file zugewiesen, daher gehe ich davon aus, dass dies geschehen ist. Sie haben die Ausgabe Ihres Befehls $y zugewiesen, daher werde ich dasselbe tun.

Mit grep

Dies ähnelt JJoaos Methode , und Sie können diese Methode auch mit der Befehlsersetzung verwenden, wenn der reguläre Ausdruck dort Ihren Anforderungen besser entspricht.

y="$(grep -oPm1 'MOM:\K\w+' "$file")"

-oPm1 ist nur eine kompaktere Art, -o -P -m 1 zu schreiben.

  • -o druckt nur die Übereinstimmungen, nicht die gesamte Zeile.
  • -P verwendet PCRE , das nterstützt \K zum Löschen von bisher abgeglichenem Text, sodass dieser nicht im zurückgegebenen abgeglichenen Text enthalten ist.
  • -m 1 stoppt nach einmaligem Abgleichen des Musters. Auf diese Weise weisen Sie der Variablen nur die erste Übereinstimmung zu und nicht mehrere Übereinstimmungen, die durch Zeilenvorschub getrennt sind.

Beachten Sie, dass Sie dem Befehl in JJoaos Antwort auch -m1 hinzufügen können, sodass nur Übereinstimmungen aus der ersten Zeile verwendet werden, die eine hat.

Wenn die erste Zeile einer Übereinstimmung mehrere Übereinstimmungen enthält , erhalten Sie mit dieser grep-Methode alle . Wenn diese Zeile beispielsweise MOM:MANIKA MOM:JANE"></td><br> lautet, enthält $y den Wert:

MANIKA
JANE

Mit sed

Dies ähnelt Zannas Methode .

y="$(sed -rn '0,/.*MOM:(\w+).*/ s//\1/p' "$file")"

Abgesehen davon, dass es sich um eine Befehlsersetzung handelt, sind die Unterschiede, dass ich:

  • stoppt nach der ersten Zeile, die eine Übereinstimmung enthält
  • stimmen mit einem oder mehreren Wortzeichen (\w+) statt mit Zeichen bis zu einem " ([^"]+) überein
  • verbrauchen Sie zuerst null oder mehr beliebige Zeichen (.*), damit MOM: nicht ganz am Anfang der Zeile stehen muss
  • verwenden Sie eine kompaktere Syntax, die ein zweimaliges Schreiben des Musters vermeidet.

Die Technik, die ich dafür verwendet habe erfordert GNU sed , aber das ist die sed Implementierung, die in Ubuntu bereitgestellt wird.

Wenn die erste Zeile einer Übereinstimmung mehrere Übereinstimmungen enthält , gibt Ihnen diese sed-Methode nur die letzte . Von MOM:MANIKA MOM:JANE"></td><br> erhalten Sie:

JANE
1
Eliah Kagan