正確な単語をgrep

正確な単語をgrep

サンプルファイル:

t2csi1m9@olth101 [bundleversion_sync]$ cat 1
arun:1.0
arun_kumar:1.2
arun-vinoth:1.3
arun_arun:1.4
t2csi1m9@olth101 [bundleversion_sync]$

t2csi1m9@olth101 [bundleversion_sync]$ grep -w 'arun' 1
arun:1.0
arun-vinoth:1.3
t2csi1m9@olth101 [bundleversion_sync]$

arunファイルをgrepすると12つの出力が出て、最初の出力だけが必要です。 (arun:1.0)。

答え1

はい、2つの一致を取得します。どちらも単語を別々の単語としてarun:1.0含め、単語ではなく文字の前に終わり、両方の結果が単語文字として扱われるためです。arun-vinoth:1.3arun:-_arun_kumar:1.2いいえあなたの命令に従って戻りなさい)。

この場合、^arun:検索パターンとして使用することをお勧めします(たとえば、文字列で始まるすべての行)arun:

答え2

定義言葉forはgrep -w一連の英数字またはアンダースコア文字です(ロケールまたはASCIIでのみ実装/バージョンによって検索される内容が単語文字で始まるか終わらない場合、動作は異なります)。

などの一部のツールを使用してカスタマイズzshできますvimxterm言葉。しかし、grep私が知っている限り、何も実装されていません。したがって、他の定義が必要な場合言葉、別の方法で直接実装する必要があります。

たとえば、あなたの場合言葉定義は次のようにする必要があります。コロン、あなたはします:

grep -E '(^|:)arun(:|$)'

arun|)の後に行の先頭(^)またはaの:後にaまたは行:の終わり($)が続きます)。

または、標準の基本正規表現を使用します。

grep '^\(.*:\)\{0,1\}arun\(:.*\)\{0,1\}$'

(行の先頭(^)、オプションで()、\{0,1\}()で終わる一連の文字、オプションで()で始まる一連の文字、および行の終わり())。.*:arun:$

またはPCREを使用してください(上記のEREバリエーションに加えてPCREもサポートされています)。

grep -P '(?<![^:])arun(?![^:])'

arunそうであれば前にはない(?<!...)負の反転演算子)の後に(?!...)()以外の文字を含めることはできません。 with(単語出力のみ)、(入力からオフセットを返す)、(単語強調表示)も使用できます。:[^:]grep -ogrep -bgrep --color-w

またはあなたの言葉定義は正常でなければなりません言葉( [[:alnum:]_]) + ハイフン:

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

など。

関連情報