回答:
単語の境界として認められる3つの異なる位置があります。
- 文字列の最初の文字の前(最初の文字が単語文字の場合)。
- 文字列の最後の文字の後(最後の文字が単語文字の場合)。
- 文字列内の2つの文字の間。1つは単語文字で、もう1つは単語文字ではありません。
これらの各ケースの例を次に示します。
文字列foobar
では、最初のケースが一致します
foobar
^-----here
文字列foobar
では、2番目のケースが一致します
foobar
^--here
文字列foo bar
では、3番目のケースが一致します
foo bar
^--here, because space is not a word character
単語文字として適格なものは、特定の正規表現の実装に依存します。ただし、すべての場合において、文字([a-z]
および[A-Z]
)、数字([0-9]
)および_
は単語文字と見なされます。
したがって、投稿した正規表現の例(\b[A-Z]+\b
)は、2つの単語境界の間にあり、大文字のみで構成される最長の文字列を検索することを意味します。例で説明する方が簡単かもしれません:
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
egrep
(または/usr/xpg4/bin/egrep
)は\b
このように扱わないことに注意してください。たとえば、echo "FOOBAR" | egrep '\b[A-Z]+\b'
一致しません。
egrep '\b[A-Z]+\b' filename.sh
それを分割してみましょう:
[A-Z]
文字クラスの任意の1文字を表します
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
。[A-Z]+
1つ以上の大文字の出現を表します。例のマッチは次のようになりますA
、HELLO
、IS
、I
、ELEPHANT
、など'\bINDIA\b'
:INDIA
大文字の単語の完全な単語検索とまったく同じです。それは考えないで一致しますINDIANA
。したがって、同じ原則を適用すると、'\b[A-Z]+\b'
大文字で1文字以上の単語全体が検索されます。egrep '\b[A-Z]+\b' filename.sh
、ファイル内の大文字で1文字以上の単語を検索します- filename.sh
。\b
-単語全体の検索とまったく同じです。
[azA-Z0-9_]
ます。egrep(1)
おそらく、使用中の正規表現の修正については、マニュアルを確認してください。