Linux/bashの特定のファイルでサブストリング「abc」を検索しようとしています
私もです:
grep '*abc*' myFile
何も返しません。
しかし、私がそうするなら:
grep 'abc' myFile
一致を正しく返します。
さて、これは私にとって問題ではありません。しかし、より複雑な文字列をgrepしたい場合はどうでしょうか
*abc * def *
Grepを使用してどのように達成できますか?
アスタリスクは単なる 繰り返し演算子 ですが、繰り返しを伝える必要があります。 /*abc*/
は、abと0個以上のcを含む文字列に一致します(2番目の*はc上にあるため、最初の文字は繰り返す必要がないため無意味です)。何かに一致させたい場合は、.*
と言う必要があります-ドットは任意の文字を意味します( 特定のガイドライン内 )。単にabcに一致させたい場合は、grep 'abc' myFile
とだけ言うことができます。より複雑な一致には、.*
を使用する必要があります-grep 'abc.*def' myFile
は、abcの後にdefがオプションで間にあるものを含む文字列に一致します。
コメントに基づいて更新する:
正規表現の*
は、コンソールの*とまったく同じではありません。コンソールでは、*は glob構文 の一部であり、ワイルドカードとして機能します(たとえば、ls *.log
は.logで終わるすべてのファイルをリストします)。ただし、正規表現では、*は修飾子であり、前の文字またはグループにのみ適用されます。正規表現で*をワイルドカードとして使用する場合は、前述のように.*
を使用する必要があります。ドットはワイルドカード文字であり、ドットはドットを変更するときに1つ以上のドットを見つけることを意味します。すなわち。任意の文字を1つ以上見つけます。
ドット文字は任意の文字に一致することを意味するため、.*
は任意の文字の0回以上の出現を意味します。おそらく.*
ではなく*
を使用することになります。
「星印」は、その前に何かがある場合にのみ意味があります。ツール(この場合はgrep)がない場合は、単にエラーとして扱うことがあります。例えば:
'*xyz' is meaningless
'a*xyz' means zero or more occurrences of 'a' followed by xyz
Grep -Pを使用します。これにより、Perlスタイルの正規表現のサポートが有効になります。
grep -P "abc.*def" myfile
正規表現を使用していないので、選択するgrepバリアントはfgrep
である必要があり、期待どおりに動作します。
これはあなたが探している答えかもしれません:
grep abc MyFile | grep def
唯一のことは... "def"がOR after "abc"
「*」は前のアイテムの修飾子として機能します。したがって、「abc * def」は「ab」に続いて「def」が続く0個以上の「c」を検索します。
おそらく必要なのは「abc。* def」で、「abc」の後に任意の数の文字が続き、「def」が続きます。
これは私のために働いた:
grep "。* $ {expr}"-ドットが前に付いた二重引用符付き、追加スイッチなしの標準grep.