![Referenz](https://rvso.com/image/52094/Referenz.png)
In der Manpage von grep
sehe ich
The symbols \< and \> respectively match the empty string at the beginning and
end of a word. The symbol \b matches the empty string at the edge of a word.
Aber ich kann den Unterschied immer noch nicht erkennen. Für mich \b
ist es Perls Notation für Wortgrenzen, während \<
es Vims Notation für denselben Zweck ist.
PS: Englisch ist nicht meine Muttersprache. Entschuldigen Sie, wenn Ihnen der Unterschied offensichtlich ist.
Antwort1
\<
passt zum Anfang eines Wortes
\>
passt zum Ende eines Wortes
\b
passt zu beiden Grenzen, egal ob am Ende oder am Anfang
Das Wichtige an diesen Sonderzeichen ist, dass sie mit einer leeren Zeichenfolge übereinstimmen und nicht mit der Wortgrenze selbst. Eine Wortgrenze ist das Gegenteil des Zeichensatzes, der in der Posix-Notation durch das \w
Äquivalent [_[:alnum:]]
(Buchstaben a bis Z, Ziffern und _
) dargestellt wird.
Beispiel
Endlich,Graeme findet ein sehr interessantes Beispiel:
$ echo 'acegi z' | grep -o '[acegi ]*\>' | cat -A
acegi$
$ echo 'acegi z' | grep -o '[acegi ]*\b' | cat -A
acegi $
Derzeit zeigt dieses Beispiel, dass es manchmal sinnvoll sein kann, genau das Wortende statt einer Wortgrenze abzugleichen, da durch das Abgleichen des Wortendes die Verwendung von Leerzeichen vermieden wird.
In einem nützlicheren Beispiel würde ich also sagen, dass Sie ; nicht verwenden können, wenn Sie Nicht-Wortzeichen und das Ende dieses Nicht-Worts abgleichen möchten, \>
aber vielleicht \b
kann es in diesem speziellen Fall verwendet werden, da es mit dem Anfang des nächsten Worts übereinstimmt.
Bisher ist mir kein Beispiel eingefallen. Aber meiner Meinung nach gibt es wahrscheinlich einige wenige Anwendungsfälle, in denen es Sinn ergibt, aber ich vermute, dass es nur der Lesbarkeit dient, denn wenn man es \b
vage formuliert, aber wenn man den Anfang oder das Ende des Wortes präzisiert, vermittelt es den Personen, die es lesen, ein besseres Verständnis des regulären Ausdrucks.
Antwort2
Um die Frage zu Ihrem Titel zu beantworten?
Was ist der Unterschied zwischen
\b
und\<
...
Fast keine. Beide entsprechen demGrenze, der Übergang zwischen einem Wort und einem Nicht-Wort.
Die einzigetechnischUnterschied ist:
- Das
\b
Spiel die Grenze aufbeideAnfang und Ende eines Wortes. - Das
\<
einzige Spiel derStarteines Wortes. - Das
\>
einzige Spiel derEndeeines Wortes.
DerpraktischUnterschied ist:
$ echo ',,abc...' | grep -o '[abc.,]*'
,,abc... # match the whole string
$ echo ',,abc...' | grep -o '[abc.,]*\b'
,,abc # to the rightmost (due to *) word boundary.
$ echo ',,abc...' | grep -o '[abc.,]*\>'
,,abc # match to the same point (in this case).
$ echo ',,abc...' | grep -o '[abc.,]*\<'
,, # match to the rightmost **start** of a word.
Dasselbe könnte mit Leerzeichen gemacht werden (Katze hinzugefügt, um die Leerzeichen anzuzeigen):
Bis zur äußersten rechten „Wortgrenze“ (beliebig) (beachten Sie die Leerzeichen):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\b' | cat -A
abcd abcd $
Bis ganz rechts zum „Wortanfang“ (gleiche Stelle):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\<' | cat -A
abcd abcd $
Bis zum äußersten rechten „Wortende“ (ohne abschließendes Leerzeichen):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\>' | cat -A
abcd abcd$
Oder mit sed:
Vier Wortgrenzen:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
Zwei Wortanfänge:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
Und zwei Worte am Ende:
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
Referenz
Aus GNU info sed:
‚\b‘
Stimmt mit einer Wortgrenze überein; das heißt, es stimmt überein, wenn das Zeichen links ein „Wort“-Zeichen und das Zeichen rechts ein „Nicht-Wort“-Zeichen ist oder umgekehrt.
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
Anfang
„<“ Passt zum Anfang eines Wortes.
$ echo "abc %-= def." | sed 's/\</X/g' Xabc %-= Xdef.
Ende
’>’ Passt zum Ende eines Wortes.
$ echo "abc %-= def." | sed 's/\>/X/g' abcX %-= defX.