![參考](https://rvso.com/image/52094/%E5%8F%83%E8%80%83.png)
在 的手冊頁中grep
,我看到
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.
但我仍然無法弄清楚其中的差異。對我來說,\b
是 Perl 的字邊界表示法,而\<
Vim 的表示法也用於相同目的。
PS:英文不是我的母語。如果您覺得差異很明顯,請原諒我。
答案1
\<
匹配單字的開頭
\>
匹配單字的結尾
\b
會匹配兩個邊界(如果位於末尾或開頭)
這些特殊字元的重要之處在於它們匹配空字串而不是單字邊界本身。字邊界與Posix 表示法中\w
價的 [_[:alnum:]]
(字母 a 到 Z、數字和)表示的字元集相反。_
例子
最後,格雷姆找到一個非常有趣的例子:
$ echo 'acegi z' | grep -o '[acegi ]*\>' | cat -A
acegi$
$ echo 'acegi z' | grep -o '[acegi ]*\b' | cat -A
acegi $
目前,此範例表明,有時精確匹配單字結尾而不是單字邊界可能很有用,因為透過匹配單字結尾可以避免使用匹配空格字元。
因此,在一個更有用的示例中,我想說,如果您想匹配非單字字元和該非單字的結尾,則不能使用\>
;但也許\b
可以在這種特殊情況下使用,因為它將匹配下一個單字的開頭。
到目前為止,我還沒有想到任何例子。但在我看來,可能有一些用例是有意義的,但我的猜測是,它只是出於可讀性的目的,因為當你把\b
它放在模糊的地方,但如果你精確地開始或結束單詞,那麼它可以更好地理解正則表達式給閱讀它的人。
答案2
回答你標題上的問題?
\b
和有什麼差別\<
...
幾乎沒有。兩者都匹配邊界,單字和非單字之間的過渡。
唯一的技術的差別在於:
- 匹配
\b
邊界兩個都單字的開頭和結尾。 - 唯一
\<
匹配的是開始一句話。 - 唯一
\>
匹配的是結尾一句話。
這實際的差別在於:
$ 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.
對於空格也可以做同樣的事情(新增 cat 以顯示空格):
直到最右邊的「單字邊界」(任意)(注意空格):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\b' | cat -A
abcd abcd $
直到最右邊的「單字開始」(同一點):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\<' | cat -A
abcd abcd $
直到最右邊的「字尾」(無尾隨空格):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\>' | cat -A
abcd abcd$
或者,使用 sed:
四字邊界:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
兩個字的開頭:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
以及單字的兩個結尾:
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
參考
來自 GNU 資訊 sed:
'\b'
匹配單字邊界;也就是說,如果左側的字符是“單字”字符並且右側的字符是“非單詞”字符,則它匹配,反之亦然。
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
開始
'<' 符合單字的開頭。
$ echo "abc %-= def." | sed 's/\</X/g' Xabc %-= Xdef.
結尾
'>' 符合單字的結尾。
$ echo "abc %-= def." | sed 's/\>/X/g' abcX %-= defX.