![参照](https://rvso.com/image/52094/%E5%8F%82%E7%85%A7.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 の同じ目的の表記法です。
追記: 英語は私の母国語ではありません。違いが明らかな場合はご容赦ください。
答え1
\<
単語の先頭に一致
\>
します 単語の末尾に一致します
\b
末尾または先頭の両方の境界に一致します
これらの特殊文字に関する重要な点は、単語境界自体ではなく、空の文字列に一致することです。単語境界は、Posix 表記法で(文字 a から Z、数字、および)\w
に 相当する文字セットの反対です。[_[:alnum:]]
_
例
ついに、グレアムは非常に興味深い例を見つけました:
$ 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 を使用する場合:
4 つの単語境界:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
単語の始まりが2つあります:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
そして、単語の終わりは2つあります。
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
参照
GNU info 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.