2017-06-23 4 views
1

Ich versuche herauszufinden, warum meine Regex in jeder anderen Skriptsprache funktioniert, aber nicht, wenn ich eine Webseite in sed mit demselben Ausdruck pipe.Regex funktioniert überall außer sed

Ich laufe dies:

wget -qO- http://website.com/page.html | sed -n '/([0-9]+)(?=%<\/td>)/g'

Ich bin für alle Stellen der Suche das letzte Auftreten von vorhergehenden "% </td>".

Die Regex funktioniert in PHP, Python, Ruby und Javascript, aber in sed gibt es überhaupt nichts zurück.

Wie kann ich diese Regex in sed arbeiten?

+0

@anubhava doh! in Ordnung. Macht awk oder grep? Oder müsste ich den Ausdruck neu denken – Moses

+0

Sie suchen nach 'grep' -' grep -oP '[0-9] + (? =%)' 'vielleicht. –

+0

@ WiktorStribiżew genial. Das hat den Trick gemacht. Fühlen Sie sich frei, das als Antwort zu posten. Lief wie am Schnürchen. – Moses

Antwort

1

sed wird meist zum Entfernen/Ersetzen von Strings in Dateien verwendet. Da Sie müssen extrahieren Übereinstimmungen, grep sollte nützlich sein, vor allem mit der -P Option, die Sie PCRE Regex-Muster (die sowohl Lookbehinds und Lookaheads ermöglichen) verwenden können.

Also, in Ihrem Fall, können Sie

grep -oP '[0-9]+(?=%</td>)' 

Die -o Option die Spiele nur ausgegeben, verwenden und -P wird PCRE Regex-Engine ermöglichen das Muster Parsen.

Ein Test auf 14 Ubuntu und eine Datei, die nur <td>word 15%</td><td>word 85%</td><td>word 6%</td><td>word 1865%</td> Linie hat:

enter image description here

+1

Ich hatte es vorher mit grep versucht und war mir nicht bewusst, dass der '-P' Schalter war, weshalb der Lookahead auch nicht funktionierte. Vielen Dank! – Moses

1

Alle Werkzeuge unterstützen spezifische regexp Varianten und einige haben zusätzliche Einschränkungen und einige Werkzeuge unterstützen verschiedene Aromen je nachdem, welche Argumente Sie passieren zu ihnen.

sed unterstützt standardmäßig BREs, und einige seds (GNU und OSX) unterstützen auch EREs, wenn sie mit -E aktiviert sind, aber keine unterstützt PCREs.

grep unterstützt standardmäßig BREs, EREs bei Aktivierung mit -E und PCREs bei Aktivierung mit -P. Es ist erwähnenswert, dass -P ist nur GNU Grep und wie ihre man-Seite sagt, dass die Funktionalität ist highly experimental so YMMV mit es zu verwenden.

awk unterstützt nur EREs.

Ich denke, perl unterstützt nur PCREs, aber Sie müssten die man-Seite überprüfen.

Bei Probeneingang und erwartete Ausgabe zeigen wir Ihnen, könnte, wie zu tun, was Sie wollen, ohne eine PCRE zu benötigen aber anstatt dass - bei einer Vermutung es wie klingt alles was Sie brauchen ist:

sed 's:.*\([0-9]*\)%</td>.*:\1:' 

das würde Arbeitet in allen sds auf allen UNIX-Boxen.