Non greedy matching mit ? mit grep
Ich Schreibe ein bash-Skript für die Analyse einer html-Datei und
Ich möchte den Inhalt der einzelnen <tr>...</tr>
. Also mein Befehl sieht folgendermaßen aus:
$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'
Aber es scheint, dass grep
gibt mir das Ergebnis:
$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>'
Wie kann ich .*
nicht gierig?
- Das obligatorische: Sie können nicht Parsen von html mit regulären Ausdrücken
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
GNU Grep
können Sie-P
um das match non-greedy:Den
-P
option ermöglicht es, Perl-Kompatiblen Regulären Ausdruck (PCRE), die notwendig ist, non-greedy matching mit?
als einfache Reguläre Ausdruck (BRE) und Extended Regular Expression (ERE) nicht unterstützen.Wenn Sie
-P
Sie können auch look around zu vermeiden, drucken Sie die tags in das match so:Wenn Sie nicht über
GNU grep
und die HTML wohlgeformt sind, Sie könnten einfach tun:Hinweis: Das obige Beispiel funktioniert nicht mit verschachtelten tags innerhalb
<tr>
.Non-greedy matching ist nicht Teil der Erweiterten syntax für Reguläre Ausdrücke unterstützt durch
grep -E
. Verwendengrep -P
stattdessen, wenn Sie haben, oder wechseln Sie zu Perl /Python /Ruby /was haben Sie. (Oh, undpcregrep
.)Natürlich, wenn Sie wirklich meinen
sollten Sie sagen, dass, statt; anschließend plain old
grep
funktionieren.Könnte man (mühsam) erweitern Sie die regex zu akzeptieren, verschachtelte tags, die nicht
<tr>
aber natürlich ist es besser mit einem richtigen HTML parser als verbringen viel Zeit wiederentdeckt, warum reguläre Ausdrücke sind nicht das richtige Werkzeug für diese..*?
ist ein regulärer Perl-Ausdruck. Ändern Sie Ihregrep
zugrep -oP '(?<=<tr>).*?(?=</tr>)'
-- mit look-around für das auslassen der eigentlichen tagsVersuchen, die perl-Stil-regexp