Grepの単語境界


22

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です


4
/は単語の文字と見なされないので、正規表現は一致しません- 「英数字シーケンスの前後に\ b一致」は「単語の前後」と言うよりも正確です
フェリペアルバレス

回答:


27

\<そして\>開始し、それぞれの単語の終わりだけ単語構成文字で空の文字列にマッチは以下のとおりです。

[[:alnum:]_]

からman grep

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

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

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

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

例:

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

私は質問を投稿した後も同じように考えています。私が達成したいことの提案はありますか?
フェリペアルバレス

@FelipeAlvarez編集内容を確認してください
。– heemayl

1

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

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

-wgrep のオプションに代わるものは、次のようなものです。

egrep "(^|\W)/media/fresh($|\W)"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.