Nicht gierige Übereinstimmung mit? mit Grep

7

Ich schreibe ein Bash-Skript, das eine HTML-Datei analysiert und Ich möchte den Inhalt jedes einzelnen <tr>...</tr> erhalten. Also sieht mein Befehl so aus:

%Vor%

Aber es scheint, dass grep mir das Ergebnis von:

gibt %Vor%

Wie kann ich .* nicht gierig machen?

    
Sven Richter 01.10.2013, 20:21
quelle

4 Antworten

14

Wenn Sie GNU Grep haben, können Sie -P verwenden, um die Übereinstimmung nicht gierig zu machen:

%Vor%

Die Option -P aktiviert Perl Compliant Regular Expression (PCRE) , die für die nicht gierige Übereinstimmung mit ? als regulärer Basisausdruck (BRE) und benötigt wird Erweiterter Regulärer Ausdruck (ERE) unterstützt dies nicht.

Wenn Sie -P verwenden, können Sie auch Umfragen verwenden, um zu vermeiden, dass die Tags in der Übereinstimmung gedruckt werden so:

%Vor%

Wenn Sie nicht GNU grep haben und der HTML-Code gut formatiert ist, können Sie einfach Folgendes tun:

%Vor%

Hinweis: Das obige Beispiel funktioniert nicht mit verschachtelten Tags innerhalb von <tr> .

    
Chris Seymour 01.10.2013, 20:25
quelle
4

Die nicht gierige Übereinstimmung ist nicht Teil der erweiterten Syntax für reguläre Ausdrücke, die von grep -E unterstützt wird. Verwenden Sie stattdessen grep -P oder wechseln Sie zu Perl / Python / Ruby / was haben Sie. (Oh, und pcregrep .)

    
tripleee 01.10.2013 20:26
quelle
3

.*? ist ein regulärer Perl-Ausdruck. Ändere dein grep zu

%Vor%     
ThisSuitIsBlackNot 01.10.2013 20:25
quelle
3

Versuchen Sie perl-style-regexp

%Vor%     
Fredrik Pihl 01.10.2013 20:25
quelle

Tags und Links