2017-10-03 9 views
0

私は単語の辞書を持っており、生成された単語がリストに存在するかどうかを調べてgrepを使っているかどうかを確認したい。私の問題は、grepが不要な場所を返すのを止めることができないということです。グレープの一文字正規表現

たとえば、私は、単語メニューをgrepするだけで完全一致を返すようにしたいので、私が使用:

grep -iw menu words.dat 

これは、両方のメニューを返却して、メニューの。私は、次のような正規表現で遊んだ:

grep -ie '^menu.' words.dat 

これは、メニューから始まり、その後の任意の文字数を返します。繰り返しますが、同じコマンドを-wと一緒に使用すると、メニューとメニューが表示されます。

1文字でワイルドカードを使用するようにgrepコマンドを制限する方法を教えてください。否定先読みで

+1

サンプルの入力と期待される出力をコードタグに親切に投稿します。 – RavinderSingh13

+0

単語を検索して正確な一致のみを返すか、ワイルドカードを使用しますか?また、どのような "シングルキャラクター"? – melpomene

+0

が明確ではありませんが、行全体をマッチさせたい場合は、grepが '-x'オプションをサポートしているかどうかを確認してください。' grep -ix 'men.''は 'men'で始まる4文字の全行だけを返します。 .xがなければ、 'grep -i '^ menとなります。$'' – Sundeep

答えて

1

あなたは-wフラグの意味を誤解しています。あなたが明らかにしようとしているのは、行全体を網羅するために一致する必要があるでしょう。

grep -x menu. words.dat 

です。

通常の動作であるgrepは、正規表現が行のどこにでも一致する場合は常に一致する行全体を返します。

[-w]オプションでは、他のテキストと "非単語"文字で区切られている必要があります。 "単語"と "非単語"の正確な定義はあなたのロケールにも依存するかもしれませんが、従来のC/POSIXの意味は[a-zA-Z0-9_]が "単語"文字で、何か他のもの(別名:[^a-zA-Z0-9_] - アポストロフィとダッシュ)はありません。したがってgrep -w menumenu'sと一致します。これは、正規表現に一致するテキストが(何もない)単語にない文字に隣接するためです。

-xオプションは、^(行頭)とアンカー$(行の終わり)で正規表現を包むと基本的に同じです。したがって、grep -x menuは、grep '^menu$'と同等の便利なものです。つまり、行の先頭、m、e、n、u、行末に一致します。

-oは、一致するテキストのみを出力するとも言います。したがって、grep -o boo <<<'kaboom'は、一致する行のうちが一致している間は、非ワード文字に隣接していないか、何も表示されないため何も印刷しません。booが印刷されます。

+0

私はそれをはっきりさせていないことをお詫びし、今それを読んで私は私の混乱を見ることができます。私は文字列 'men'を持っています。ファイルから 'men'で始まる4文字の単語の出現をgrepしたいと思います。だからメニューを取得する必要がありますが、メニューは表示されません。それは役に立ちますか?私のバージョンのgrepは-xをサポートしていないようです。 – user3120872

+0

その後、私が投稿に示唆したようにアンカーを追加します。正規表現 '^ men。$'が必要です(シェルから保護するには、一重引用符で囲む必要があります)。 – tripleee

1

と後読み

grep -iP '(?<![\w\x27])menu(?![\w\x27])' words.dat 

は私の代わりに、単一引用符\x27実際の文字のASCIIコードを使用しています。 効果的に、ワード境界の考慮事項として「単語」に'を含めます。


$ cat words.dat 
menu 
MENU 
notmenu 
NOTMENU 
menu's 
$ grep -iP '(?<![\w\x27])menu(?![\w\x27])' words.dat 
menu 
MENU 
0

私は必要なものを見つけたと思う。または動作するようです。

これは、menで始まる項目を返し、その後ろに1文字しか返しませんでした。実際には、男性から始まる4文字の言葉を私に与えています。

回答した方に感謝します。

+0

これは、あなたが私たちの残りの部分と非常に異なっている場合を除いて、あなたに任意の* 5文字*の単語を与えるでしょう; "男性"は3であり、次にあなたは2つ以上を許可します)。また、2番目の '、2'はここでは冗長で、' -x'と一緒に '^'は必要ありません。 – tripleee