2009-07-01 5 views
40

で星印を使用してだから私は実行します。私は、Linux/bashの</p> <p>内の特定のファイル内のサブストリング「ABC」を検索しようとしていますグレップ

grep '*abc*' myFile 

それは何も返しません。

しかし、私がしなければ:それは正しくマッチを返す

grep 'abc' myFile 

これは私にとっては問題ではありません。しかし、もっと複雑な文字列をgrepしたいとしたら、

*abc * def * 

grepを使ってどのようにしたらいいでしょうか?それの前に何かがある場合は、「星座」は唯一の意味がある

The grep man page

+3

doesnのはgrep自体」ほとんどのプラットフォームでワイルドカードをサポートしています。ワイルドカードを使用するには、egrepを使用する必要があります。シェルのシンタックスは異なります。シェルの「*」はです。 egrepでは、それは "0から前のエンティティの多くに"という演算子です。 grepでは、それはただの文字です。 – PanCrit

+0

@PanCrit: '*'はgrepとegrepの中で同じことを意味します:前のアトムの0個以上を意味する*量子*です。これは、シェルが使用する*ワイルドカード*とはまったく異なる概念です。 –

答えて

63

アスタリスクはちょうどrepetition operatorですが、繰り返す内容を伝える必要があります。 /*abc*/は、abとゼロ以上のcを含む文字列と一致します(2番目の*はcにあるため、最初のものは何も意味がありません)。どんなものとでも一致させたい場合は、.*と言う必要があります。ドットは任意の文字(within certain guidelines)を意味します。あなたがちょうどabcと一致したいならば、あなたはちょうどgrep 'abc' myFileと言うことができます。あなたのより複雑なマッチでは、.* - grep 'abc.*def' myFileを使用する必要があります。abcが含まれている文字列と、それに続くdefを任意に組み合わせて使用​​します。コメントをもとに

更新:

*正規表現で正確コンソールの*と同じではありません。コンソールでは、*はglob constructの一部で、ワイルドカードとしてのみ機能します(たとえば、ls *.logは.logで終わるすべてのファイルをリストします)。ただし、正規表現では、*は修飾語です。つまり、その前の文字またはグループにのみ適用されます。正規表現で*をワイルドカードとして使用する場合は、前述のように.*を使用する必要があります。ドットはワイルドカード文字で、スターはドットを変更するときに1つ以上のドットを見つけることを意味します。すなわち、任意の文字の1つまたは複数を見つける。

+1

質問者がシェルのワイルドカードと正規表現の違いについて混乱していると思います。私はまた、より複雑な表現がgrep 'abc。* def'(少なくとも1つの空白が存在する - 恐らく私が書いたように2つ)と思われる。 –

+1

実際、質問者は 'abc'は '^ abc $'と同じではないことを理解していないようです:-D – Massa

+1

はい、私はglobと完全な正規表現の間で混乱しました。私はドットなしの*をシェル上の何かにマッチさせることを意味します。 – Saobi

2

するTryのgrep -Eのも見てみましょう。ツールがない場合(この場合はgrep)、エラーとして扱うことができます。例:

'*xyz' is meaningless 
'a*xyz' means zero or more occurrences of 'a' followed by xyz 
8

:拡張正規表現のサポート

ため

+4

*は無意味ではありません。それはちょうど(繰り返しの)その通常の意味を持っていないが、 "私は星だ"を意味します。それは、x、y、zのあとに続く星を含む行と一致します。 –

+1

@ジョナサンそれはツールによって異なります。 –

0

'*'は前の項目の修飾子として機能します。だから、 'abc * def'は 'ab'の後に0以上の 'def'が続くものを検索します。

「abc。* def」は、「abc」とそれに続く「def」の文字数を検索します。

7

ドット文字は任意の文字と一致するため、 '。*'は0文字以上の任意の文字を意味します。おそらく、「*」ではなく「。*」を使用することを意味します。

ああ、がらくた、

1

使用はgrep -P - Perlのスタイルの正規表現のサポートを可能にします。例えばLinuxのシェルのコマンドライン上で動作するもののような

grep -P "abc.*def" myfile 
4

あなたがしようとした表現は、「glob」と呼ばれています。グロブの表現は完全ではありませんregular expressions、これはgrepが検索する文字列を指定するために使用します。 Hereは、(古い、小さい)投稿の違いについてです。グロブ表現は( "ls *"のように)シェル自体によって解釈されます。

グロブスからREへの変換は可能ですが、通常は頭の中で行う必要があります。

+1

シェルによって解析されるのはglobだけです。彼は一重引用符で囲まれた検索文字列を保持しているので、シェルは文字列だけを残して、そのままargvでgrepに渡します。 –

4

あなたは正規表現を使用していませんので、ご希望のgrepバリエーションはfgrepでなければなりません。これは期待どおりに動作します。

0

これは、あなたが探している答えである可能性があります

grep abc MyFile | grep def 

だけの事は...それは、出力ラインは「DEF」だっただろうされるが、「ABC」の前か後にある

関連する問題