次の入力があります。
csdi_d_trs_proc_uxs1 26 24
csdi_d_tdp_process_uxs1 28 32
proc
以下を使用する場合は、次のものを含めてください。
grep proc filename
両方の行が出力されるので、試してみましたが、grep -w proc filename
出力は表示されません。
proc
どのようにラインだけを得ることができ、ラインは取得できませんかprocess
?
答え1
-w
forフラグは、grep
与えられた式が単語全体に一致するようにします。
「単語」は、「単語以外の文字」(または行の先頭/末尾)で囲まれた「単語文字」の文字列です。
あなたの場合、問題は_
(アンダースコア)がまさに「単語文字」なので、proc
単語だけでは資格を与えられないことです。
-w
withを使用する代わりに、grep
単語を明示的に区別するパターンを使用してください_
。
grep '_proc_' filename
または、アルファベットの小文字以外の文字で単語を区切るには、次の[^a-z]
代わりに使用します。_
grep '[^a-z]proc[^a-z]' filename
proc
行の先頭/末尾の単語は認識されません。
答え2
-w, --word-regexp
単語全体を構成する項目を含む行のみを選択してください。 [...] 単語を構成する文字は、文字、数字、下線です。
ほとんどのプログラミング言語(少なくともC、Perl、シェル)では、下線は識別子の一部として有効であるため、ここでは「単語文字」と見なされます。
単語だけを一致させる1つの方法は、Perl正規表現によって提供される否定的な予測と予測テストを使用することです。ここで意味するのは、(?<![a-z])
「その前には小文字がなく、(?![a-z])
後にも同様に文字がありますproc
。
pcregrep '(?<![a-z])proc(?![a-z])' filename
または、行の始まりと終わりを明示的に考慮してgrep EREを使用します。
grep -E '(^|[^a-z])proc([^a-z]|$)' filename
(どちらがよりきれいかわかりません。)
自然言語のテキストがある場合は[[:alpha:]]
おそらく[a-z]
。
しかし、もちろん、_proc_
そこに下線があることを知っていればgrepする方が簡単です。