「grep -w」でどの文字が「単語」を構成しているのか、どうすればわかりますか?

「grep -w」でどの文字が「単語」を構成しているのか、どうすればわかりますか?
$ printf 'asf .test. afd\nasaf foo-test asfdads\n'
asf .test. afd
asaf foo-test asfdads

$ printf 'asf .test. afd\nasaf foo-test asfdads\n' | grep -w test
asf .test. afd
asaf foo-test asfdads

質問:「foo-test」をどのように一致させるのですか?より正確には、「-w」は「-」を区切り文字として使用し、「.」は使用しないとどうすればいいですか?

それとも、grepこの人物が.作られた人物の一つと見なされますか?性格したがって、存在しません。単語の境界.と〜の間にあるtest

それともgrepに加えて他の解決策はありますか?

答え1

2.19より前のバージョンでは、GNUはシングルバイト文字数字とアンダースコア(したがってUTF-8ロケールでは26 + 26 + 10 + 1(ASCII文字、数字、アンダースコア))のみを単語コンポーネントと見なしましたgrep-wたとえば、echo Stéphane | grep -w St一致します。この問題は2.19で修正されました。

ただし、ロジックを手動で実装できます。

 grep -E '([^[:alnum:]_.]|^)test([^[:alnum:]_.]|$)'

前には単語ではないコンポーネントや行の始まりがありtest、後には単語ではないコンポーネントや行の終わりが続きます。

(上記は[:alnum:]ASCIIだけでなく、そのロケールの数字と文字と一致します。ASCIIのみが必要な場合は、ロケールをCに変更してください。)

周りの単語以外のコンポーネントを一致に含めたくない場合(たとえば、GNUを使用するため-o)、今回はPCRE正規表現と同様の演算子を使用できます。

grep -Po '(*UCP)(?<![\w.])test(?![\w.])'

ASCII文字と数字のみが一致するように削除して(*UCP)追加します。LC_ALL=C

(*UCP)PCREライブラリに通知するために正規表現の先頭に使用U̲niC̲odeパフォーマンスに使用する必要があります\w

それ以外の場合は、\wロケールの英数字と下線文字が一致しますが、単一バイト文字のみが一致します。 ASCII言語のみが一致するため、UTF-8ロケール(現在の標準)では機能しません。(*UCP)UTF-8でも動作するようにしてください。これはPCRE自体の文字属性の概念によって一致し、これはユーザーのロケールと異なる場合がありますが、GNUシステムでは不完全で古い(少なくとも2015年4月現在)UTF-8ロケール定義と同じです。

関連情報