grep caret scheint keine wirkung zu haben

7

Ich hatte den Eindruck, dass ein Caret-Symbol " Anfang der Zeile " mit erweiterten regulären POSIX-Ausdrücken bedeutet.

Wenn ich es damit benutze grep, verhält es sich jedoch unerwartet.

Ich verwende GNU grep 2.5.4 unter Ubuntu 10.04 Lucid Lynx .

Ich spreche eine Zeile ' Hallo ' aus und leite sie dann an eine Zeile weiter, grepdie nach " null oder mehr Leerzeichen gefolgt vom Buchstaben h " sucht :

echo ' hello' | grep -E '[:space:]*h'
hello

grep findet es ok

Wenn ich ein Caret hinzufüge, um anzuzeigen, dass das Muster nur mit " null oder mehr Leerzeichen gefolgt vom Buchstaben h am Anfang der Zeichenfolge " übereinstimmen soll :

echo ' hello' | grep -E '^[:space:]*h'

Es wurden keine Übereinstimmungen gefunden. Ich würde erwarten, dass die Zeichenfolge übereinstimmt, da sie mit Leerzeichen gefolgt von h beginnt .

Warum verhindert dieses Caret-Symbol eine Übereinstimmung?

JW01
quelle

Antworten:

7

Um ein Leerzeichen zu finden, müssen Sie ein [:space:]weiteres Paar Klammern verwenden, die wie folgt aussehen [[:space:]]. Sie wollten wahrscheinlich ausdrückengrep -E '^[[:space:]]*h'

Um zu erklären, warum Ihr aktuelles fehlschlägt:

Wie es aussieht, [:space:]*hbeinhaltet eine Zeichenklasse für jede der Figuren suchen: :, s, p, a, c, und ewelche beliebig oft auftreten (einschließlich 0), gefolgt von h. Dies passt gut zu Ihrer Zeichenfolge, aber wenn Sie ausführen grep -o, werden Sie feststellen, dass Sie nur mit hdem Leerzeichen und nicht mit dem Leerzeichen übereinstimmen .

Wenn Sie am Anfang ein Karat hinzufügen, muss entweder einer dieser Buchstaben oder hder Anfang der Zeichenfolge übereinstimmen, aber keiner stimmt überein, sodass er nicht übereinstimmt.

Shawn J. Goff
quelle
Aaahaa. Das macht Sinn.
JW01
4

Es wird davon ausgegangen, dass dies [:space:]nur in einem Klammerausdruck angezeigt wird (hervorgehobene Übereinstimmungen mit *):

echo 'hello' | grep -E '^[:space:]*h'
*h*ello
echo 'hello' | grep -E '[^[:space:]]*h'
*h*ello
echo ' hello' | grep -E '^[[:space:]]*h'
* h*ello

Dies wird durch den folgenden Ausschnitt aus man grep(meine Hervorhebung) erklärt:

Schließlich sind bestimmte benannte Zeichenklassen in Klammerausdrücken vordefiniert. [...] Beachten Sie, dass die Klammern in diesen Klassennamen Teil der symbolischen Namen sind und zusätzlich zu den Klammern , die den Klammerausdruck begrenzen , enthalten sein müssen .

l0b0
quelle
Ja. Ich denke das ist richtig. Ich habe gerade den Mann bemerkt "(Beachten Sie, dass die Klammern in diesen [vordefinierten] Klassennamen Teil der symbolischen Namen sind und zusätzlich zu den Klammern, die den Klammerausdruck begrenzen, enthalten sein müssen.)"
JW01