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