web-dev-qa-db-ja.com

Grep単語の境界

GNUドキュメンテーションに同意する:

‘\<’ Match the empty string at the beginning of Word.
‘\>’ Match the empty string at the end of Word.

/ etc/fstabは次のようになります。

/dev/sdb1       /media/fresh      ext2   defaults     0 0

/ media/freshが存在する場合、grepがTRUE/FALSEを返すようにします。 \<および\>を使用しようとしましたが、機能しませんでした。どうして?

egrep '\</media/fresh\>' /etc/fstab

回避策:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

しかし、それは醜く見えます。

私のgrepは2.5.1です

22
Felipe Alvarez

\<および\>は、Wordの先頭と末尾の空の文字列にそれぞれ一致し、Word構成文字のみが次のとおりです。

[[:alnum:]_]

man grepから:

Word-constituent characters are letters, digits, and the underscore.

したがって、/は有効なWord構成文字ではないため、正規表現は失敗します。

代わりにスペースがあるので、grep-wオプションを使用してWordと一致させることができます。

grep -wo '/media/fresh' /etc/fstab

例:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh
28
heemayl

\<(および\b)に関するこの問題は、/だけでなく、Word以外のすべての文字にも当てはまります。 (つまり、[[:alnum:]]および_。以外の文字)

問題は、次のアンカー/を検索するときに、正規表現エンジンが常に\<のようなWord以外の文字をバイパスすることです。そのため、/の直後に\<のようなWord以外の文字を配置しないでください。そうすると、構造上、何も一致しません。

Grepの-wオプションの代替は、次のようになります。

egrep "(^|\W)/media/fresh($|\W)"
1
S E