Verwirrt über die Wortgrenze

13

Ich habe dies viel recherchiert, bin mir aber immer noch nicht sicher. Was bedeutet Wortgrenze ? Was tut es?

Könnte mir zum Beispiel jemand diesen Befehl erklären?

egrep '\b[A-Z]+\b' filename.sh
user36683
quelle
1
Eine "Wortgrenze" ist das, was das verwendete Werkzeug als solches definiert. Einige betrachten Nospace / Space oder Space / Nospace als Wortgrenze, andere als ein "Wort", aus dem es besteht [azA-Z0-9_]. Überprüfen Sie das Handbuch auf egrep(1)möglicherweise die Dokumentation der verwendeten regulären Ausdrücke.
Vonbrand

Antworten:

12

Wie beschrieben hier zum Beispiel paßt es zwischen Worten:

Es gibt drei verschiedene Positionen, die als Wortgrenzen gelten:

  1. Vor dem ersten Zeichen in der Zeichenfolge, wenn das erste Zeichen ein Wortzeichen ist.
  2. Nach dem letzten Zeichen in der Zeichenfolge, wenn das letzte Zeichen ein Wortzeichen ist.
  3. Zwischen zwei Zeichen in der Zeichenfolge, wobei eines ein Wortzeichen und das andere kein Wortzeichen ist.

Hier sind Beispiele für jeden dieser Fälle:

  1. Für die Zeichenfolge foobarstimmt der erste Fall überein

     foobar
    ^-----here
    
  2. Für die Zeichenfolge foobarstimmt der zweite Fall überein

    foobar
          ^--here
    
  3. Für die Zeichenfolge stimmt foo barder dritte Fall überein

    foo bar
       ^--here, because space is not a word character
    

Was als Wortzeichen qualifiziert ist, hängt von der spezifischen Implementierung des regulären Ausdrucks ab. In allen Fällen werden jedoch Buchstaben ( [a-z]und [A-Z]), Zahlen ( [0-9]) und _als Wortzeichen betrachtet.


In dem von Ihnen geposteten Beispiel-Regex ( \b[A-Z]+\b) wird also die längste Zeichenfolge gefunden, die sich zwischen zwei Wortgrenzen befindet und nur aus Großbuchstaben besteht. Es könnte einfacher sein, dies anhand eines Beispiels zu erklären:

echo "FOOBAR" | egrep '\b[A-Z]+\b'   # Works
echo "FOO BAR" | egrep '\b[A-Z]+\b'  # Works
echo "aFOOBARb" | egrep '\b[A-Z]+\b' # Does not work, we want capitals only
echo "12345" | egrep '\b[A-Za]+\b'   # Does not work, no letters
echo "1FOOBAR2" | egrep '\b[A-Z]+\b' # Does not work, 1 and 2 are word chars
echo "_FOOBAR_" | egrep '\b[A-Z]+\b' # Does not work, _ is a word char
echo "#FOOBAR$" | egrep '\b[A-Z]+\b' # Works, # and $ are not word chars
terdon
quelle
Hervorragende Erklärung, beachten Sie nur, dass Solaris egrep(noch /usr/xpg4/bin/egrep) nicht so behandelt \b. Zum Beispiel echo "FOOBAR" | egrep '\b[A-Z]+\b'würde nicht passen.
Peter
0
egrep '\b[A-Z]+\b' filename.sh

Brechen wir es auf:

  1. [A-Z]Stellt ein beliebiges Zeichen in der Zeichenklasse dar [ABCDEFGHIJKLMNOPQRSTUVWXYZ].
  2. [A-Z]+repräsentiert ein oder mehrere Vorkommen von Großbuchstaben. Beispiel Streichhölzer wären: A, HELLO, IS, I, ELEPHANT, usw.
  3. '\bINDIA\b': ist genau wie ein GANZES WORT, bei dem nach dem Wort INDIAin Großbuchstaben gesucht wird. Es würde NICHT passen INDIANA. Wenn Sie also dasselbe Prinzip anwenden, werden '\b[A-Z]+\b'ganze Wörter mit einem oder mehreren Großbuchstaben gesucht.
  4. So egrep '\b[A-Z]+\b' filename.shwürde nach Wörtern mit einem oder mehreren Buchstaben in Großbuchstaben in der Datei gesucht - filename.sh.

\b - ist genau wie eine ganze Wortsuche.

Sanket Rajgarhia
quelle