href-Attribute aus einer HTML-Seite mit grep & Regex extrahieren

English Deutsch

Sie können einen regulären Ausdruck verwenden, um nach href="..."-Attributen in einem HTML wie folgt zu greppen:

grep-href.sh
grep -oP "(HREF|href)=\"\K.+?(?=\")"

grep wird mit -o (nur Treffer ausgeben, dies ist erforderlich, um zusätzliche Funktionen wie Lookahead-Assertions zu erhalten) und -P (Perl-Regulärer-Ausdruck-Engine verwenden) betrieben. Der reguläre Ausdruck ist im Wesentlichen

regex.txt
href=".*"

wobei das .+ im Non-Greedy-Modus verwendet wird (.+?):

regex-nongreedy.txt
href=".+?"

Dies liefert uns Treffer wie

example-link.html
href="/files/image.png"

Da wir nur den Inhalt der Anführungszeichen (") wollen und nicht den href="..."-Teil, können wir Positive Lookbehind-Assertions (\K) verwenden, um den href-Teil zu entfernen:

regex-lookbehind.txt
href=\"\K.+?\"

aber wir wollen auch das schließende Anführungszeichen loswerden. Um dies zu tun, können wir Positive Lookahead-Assertions ((?=\")) verwenden:

regex-lookaround.txt
href=\"\K.+?(?=\")

Nun wollen wir sowohl href als auch HREF matchen, um etwas Groß-/Kleinschreibungs-Unempfindlichkeit zu bekommen:

regex-case.txt
(href|HREF)=\"\K.+?(?=\")

Oft wollen wir gezielt einen Dateityp matchen. Beispielsweise könnten wir nur .png matchen:

match-png.txt
(href|HREF)=\"\K.+?\.png(?=\")

Um fälschlich zu lange Treffer auf einigen Seiten zu reduzieren, verwenden wir [^\"]+? anstelle von .+?:

match-png-safe.txt
(href|HREF)=\"\K[^\"]+?\.png(?=\")

Dies verbietet Treffer, die “-Zeichen enthalten, und verhindert dadurch, dass mehr als das Tag gematcht wird.

Verwendungsbeispiel:

wget-grep-png.sh
wget -qO- https://nasagrace.unl.edu/data/NASApublication/maps/ | grep -oP "(href|HREF)=\"\K[^\"]+?\.png(?=\")"

Ausgabe:

output.txt
/data/NASApublication/maps/GRACE_SFSM_20201026.png
[...]

Check out similar posts by category: Linux