マンページで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表記(文字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 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.