web-dev-qa-db-ja.com

grepでスター記号を使用する

Linux/bashの特定のファイルでサブストリング「abc」を検索しようとしています

私もです:

grep '*abc*' myFile

何も返しません。

しかし、私がそうするなら:

grep 'abc' myFile

一致を正しく返します。

さて、これは私にとって問題ではありません。しかし、より複雑な文字列をgrepしたい場合はどうでしょうか

*abc * def *

Grepを使用してどのように達成できますか?

72
Saobi

アスタリスクは単なる 繰り返し演算子 ですが、繰り返しを伝える必要があります。 /*abc*/は、abと0個以上のcを含む文字列に一致します(2番目の*はc上にあるため、最初の文字は繰り返す必要がないため無意味です)。何かに一致させたい場合は、.*と言う必要があります-ドットは任意の文字を意味します( 特定のガイドライン内 )。単にabcに一致させたい場合は、grep 'abc' myFileとだけ言うことができます。より複雑な一致には、.*を使用する必要があります-grep 'abc.*def' myFileは、abcの後にdefがオプションで間にあるものを含む文字列に一致します。

コメントに基づいて更新する:

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

106

ドット文字は任意の文字に一致することを意味するため、.*は任意の文字の0回以上の出現を意味します。おそらく.*ではなく*を使用することになります。

16
smcameron

「星印」は、その前に何かがある場合にのみ意味があります。ツール(この場合はgrep)がない場合は、単にエラーとして扱うことがあります。例えば:

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

試した式は、たとえばLinuxのシェルコマンドラインで機能する式のように、「 glob 」と呼ばれます。グロブ式は完全ではありません 正規表現 、これはgrepが検索する文字列を指定するために使用するものです。 ここ は、(古い、小さな)違いについての投稿です。グロブ式(「ls *」など)は、シェル自体によって解釈されます。

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

5
unwind

Grep -Pを使用します。これにより、Perlスタイルの正規表現のサポートが有効になります。

grep -P "abc.*def" myfile
4

正規表現を使用していないので、選択するgrepバリアントはfgrepである必要があり、期待どおりに動作します。

4
Andrew Beals

拡張正規表現のサポートについては、grep -Eを試してください

以下もご覧ください。

grepのマニュアルページ

3
Brian

これはあなたが探している答えかもしれません:

grep abc MyFile | grep def

唯一のことは... "def"がOR after "abc"

1
Charles Duke

「*」は前のアイテムの修飾子として機能します。したがって、「abc * def」は「ab」に続いて「def」が続く0個以上の「c」を検索します。

おそらく必要なのは「abc。* def」で、「abc」の後に任意の数の文字が続き、「def」が続きます。

これは私のために働いた:

grep "。* $ {expr}"-ドットが前に付いた二重引用符付き、追加スイッチなしの標準grep.

0
access_granted