it-swarm.com.de

Grep: Das Sternchen (*) funktioniert nicht immer

Wenn ich ein Dokument grep, das Folgendes enthält:

ThisExampleString

... für den Ausdruck This*String oder *String wird nichts zurückgegeben. This* gibt jedoch die obige Zeile wie erwartet zurück.

Ob der Ausdruck in Anführungszeichen steht, spielt keine Rolle.

Ich dachte, der Stern zeigt eine beliebige Anzahl unbekannter Zeichen an? Warum funktioniert es nur, wenn es am Anfang des Ausdrucks steht? Wenn dies beabsichtigtes Verhalten ist, was verwende ich anstelle der Ausdrücke This*String und *String?

8
Trae

Ein Sternchen in reguläre Ausdrücke bedeutet "0-mal oder öfter mit dem vorhergehenden Element übereinstimmen".

In Ihrem speziellen Fall mit grep 'This*String' file.txt versuchen Sie zu sagen: "Hey, grep, passen Sie mir das Wort Thi an, gefolgt von Kleinbuchstaben s null oder mehrmals, gefolgt von dem Wort String". Der Kleinbuchstabe s ist in Example nicht zu finden, daher ignoriert grep ThisExampleString.

Im Fall von grep '*String' file.txt sagen Sie "grep, pass auf mich auf, die leere Zeichenfolge - buchstäblich nichts - vor dem Wort String". Natürlich soll ThisExampleString nicht so gelesen werden. (Es gibt andere mögliche Bedeutungen - Sie können dies mit und ohne das -E -Flag versuchen - aber keine der Bedeutungen entspricht dem, was Sie wirklich hier wollen.)

Wenn wir wissen, dass . "ein beliebiges einzelnes Zeichen" bedeutet, können wir dies tun: grep 'This.*String' file.txt. Der Befehl grep liest es nun korrekt: This gefolgt von einem beliebigen Zeichen (stellen Sie sich das als Auswahl von ASCII Zeichen vor), das beliebig oft wiederholt wird, gefolgt von String.

15

Das Metazeichen * in BRE1s, ERE1s und PCRE1s entspricht 0 oder mehr Vorkommen des zuvor gruppierten Musters (wenn ein gruppiertes Muster vor dem Metazeichen * steht), 0 oder mehr Vorkommen der vorherigen Zeichenklasse (wenn eine Zeichenklasse vor dem Metazeichen * steht) ) oder 0 oder mehr Vorkommen des vorherigen Zeichens (wenn weder ein gruppiertes Muster noch eine Zeichenklasse vor dem Metazeichen * steht);

Dies bedeutet, dass in dem This*String - Muster das * - Metazeichen ist, dem weder ein gruppiertes Muster noch eine Zeichenklasse vorangestellt sind, und dass das * - Metazeichen mit 0 oder mehr Vorkommen des vorherigen Zeichens übereinstimmt (in In diesem Fall das Zeichen s):

% cat infile               
ThisExampleString
ThisString
ThissString
% grep 'This*String' infile
ThisString
ThissString

Um 0 oder mehr Vorkommen eines beliebigen Zeichens zuzuordnen, möchten Sie 0 oder mehr Vorkommen des Metazeichens . zuordnen, das einem beliebigen Zeichen entspricht:

% cat infile               
ThisExampleString
% grep 'This.*String' infile
ThisExampleString

Das * -Metacharakter in BREs und EREs ist immer "gierig", d. H. Es stimmt mit der längsten Übereinstimmung überein:

% cat infile
ThisExampleStringIsAString
% grep -o 'This.*String' infile
ThisExampleStringIsAString

Dies ist möglicherweise nicht das gewünschte Verhalten. Falls dies nicht der Fall ist, können Sie die PCRE-Engine von grep aktivieren (mit der Option -P) und das Metazeichen ? anhängen, das nach den Zeichen * und + eingefügt wird ] _ Metazeichen haben den Effekt, dass sie ihre Gier ändern:

% cat infile
ThisExampleStringIsAString
% grep -Po 'This.*?String' infile
ThisExampleString

1: Grundlegende reguläre Ausdrücke, erweiterte reguläre Ausdrücke und Perl-kompatible reguläre Ausdrücke

8
kos

Eine Erklärung finden Sie hier Link :

Das Sternchen "*" bedeutet in regulären Ausdrücken nicht dasselbe wie beim Platzhalter; Dies ist ein Modifikator, der auf das vorangegangene einzelne Zeichen oder auf einen Ausdruck wie [0-9] angewendet wird. Ein Stern stimmt mit keinem oder mehreren vorangestellten Zeichen überein. Somit stimmt [A-Z]* mit einer beliebigen Anzahl von Großbuchstaben überein, einschließlich keiner, während [A-Z][A-Z]* mit einem oder mehreren Großbuchstaben übereinstimmt.

4
Ova