$ 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ロケール定義と同じです。