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?

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.


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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.