Ich möchte, dass bash eine vollständige URL (und nur die URL) aus einer zufälligen kurzen Zeichenfolge analysiert / extrahiert.
Beispiele:
bob, the address is http://www.google.com
oder
https://foo.com/category/example.html is up
oder
Error 123 occurred at http://bit.ly/~1223456677878
oder
Stats are up: https://foo1234.net/report.jpg
Ich habe es versucht, cat foo_output | egrep -o "https?://[\w'-\.]*\s"
aber das schien nicht zu funktionieren.
bash
scripting
regular-expression
Mike B.
quelle
quelle
Antworten:
Hast du versucht:
stattdessen?
Beachten Sie, dass alles mit einer Zeichenklasse als Literal verstanden wird, sodass das Sprichwort
[\w]
nicht mit einem Wortzeichen übereinstimmt . Darüber hinaus müssen Sie einem Regex-Metazeichen innerhalb einer Zeichenklasse nicht entkommen, dh, das Sprichwort[\.]
ist nicht ganz dasselbe wie[.]
.quelle
[^ ]
zu breit ist, sollten Sie andere Zuschnitte auszuschließen(
,)
möglicherweise Komas, und alle Zeichen , die nicht in URLs sind nicht zulässig.URIs sind nicht gut für den Abgleich regulärer Ausdrücke geeignet, wenn sie in natürliche Sprache eingebettet sind. Der aktuelle Stand der Technik ist jedoch John Grubers verbessertes liberales, genaues Regex-Muster für übereinstimmende URLs . Wie derzeit veröffentlicht, lautet die einzeilige Version wie folgt:
John scheint auch einen Kern zu halten hier , obwohl sein Blog - Eintrag hat eine viel bessere Arbeit seinen Testkorpus zu erklären und die Grenzen des regulären Ausdruck.
Wenn Sie den Ausdruck über die Befehlszeile implementieren möchten, sind Sie möglicherweise durch die von Ihnen verwendete Engine für reguläre Ausdrücke oder durch Probleme beim Zitieren von Shell eingeschränkt. Ich habe festgestellt, dass ein Ruby-Skript die beste Option ist, aber Ihr Kilometerstand kann variieren.
quelle
Das Problem mit übereinstimmenden URLs ist, dass fast alles in einer URL enthalten sein kann:
Wie Sie sehen können, über die (gültig) URL enthält
$
,?
,#
,&
,,
,.
und:
. Grundsätzlich können Sie nur sicher sein, dass eine URL kein Leerzeichen enthält. In diesem Sinne können Sie Ihre URLs mit einem so einfachen Muster extrahieren wie:Das
\S
entspricht allen Nicht-Leerzeichen in Perl-kompatiblen regulären Ausdrücken (PCREs),-P
aktiviert PCREs fürgrep
und-o
lässt nur das übereinstimmende Segment der Zeile drucken.quelle
Ich würde mich verketten, aber ein bisschen anders. Wenn Sie einen Textausschnitt wie Ihren in einer Textdatei namens strings.txt haben, können Sie wie folgt vorgehen:
Erläuterung:
Da die URL möglicherweise nicht funktioniert, können Sie zusätzliche Fehlerprüfungen mit Ihrer interessierenden URL durchführen. Beispiel
wget -p URL -O /dev/null
: Es werden ganz andere Fehlercodes ausgegeben, falls die URL nicht verfügbar ist. Sie können also eine Schleife einrichten, um Ihre Liste der Links zu verarbeiten und ihren Gültigkeitsstatus auszugeben.Wenn Sie letztendlich Links aus HTML-Dateien extrahieren, kann es
sed
in besonderen Fällen zu Problemen kommen . Wie in einem lustigen (Beitrag) vorgeschlagen wurde , den Sie wahrscheinlich bereits gesehen haben, ist es möglicherweise am besten, keine regulären Ausdrücke, sondern eine HTML-Parser-Engine zu verwenden. Ein solcher leicht verfügbarer Parser ist der Nur-Text-Browserlynx
(verfügbar unter jedem Linux). Auf diese Weise können Sie sofort eine Liste aller Links in einer Datei sichern und dann einfach die gewünschten URLs mit grep extrahieren.Dies funktioniert jedoch nicht bei den meisten verstümmelten HTML-Dateien oder Textausschnitten mit Links.
quelle
Gerade
egrep -o 'https?://[^ ")]+'
welches beinhaltet
url()
und "http"quelle
egrep
veraltet ist.Alternativ können Sie den SED-Befehl anhängen, um ihn in der CSV-Datei zu speichern:
quelle