私は答えたスーパーユーザーに関する質問これは、grep出力に使用される正規表現に関連しています。
私が答えた答えはこんな感じです。
tail -f log | grep "some_string.*some_string"
それから私の答えに対する3つの意見で@シングル次のように書きました:
.*
欲を唱えれば、あなたが望むよりも多くを捕まえることができます。.*?
一般的には良いです。
だからこれ、
これは基本的な欲望の代わりに怠惰なものにする
?
修飾子です。*
PCREを想定します。
検索しましたが、PCRE
私の答えでこれが何を意味するのか理解できませんか?
この最後のもの、
また、これはシェルglobではなく正規表現(grepはデフォルトでPOSIX正規表現を実行する)であることを指摘する必要があります。
私は正規表現が何であるかとgrepコマンドでの基本的な使い方だけを知っています。だから私はこれら3つの意見のどれも受け取ることができず、次のような質問が心の中にあります。
- 使用上の違いは何ですか?
.*?
そして.*
? - どんな状況でどちらが良いですか?例えばください。
誰かがこのコメントを理解できれば役に立ちます。
アップデート:質問への回答正規表現はShell Globsとどう違うのですか? @クサラナンダもしこのリンク彼のコメントで。
注:必要に応じてお読みください。この質問に対する私の答え答える前にコンテキストを参照してください。
ベストアンサー1
次のような文字列を使用しているとします。
can cats eat plants?
貪欲演算子を使用c.*s
すると、でc
始まり終わる文字列全体と一致しますs
。貪欲演算子は、sが最後に表示されるまで一致し続けます。
怠惰を使用すると、文字列が最初に表示されるc.*?s
までのみ一致します。s
can cats
上記の例では、次のような結論を下すことができます。
「Greedy」は、可能な限り長い文字列と一致することを意味します。 「Lazy」は、できるだけ短い文字列と一致することを意味します。?
数量子(たとえば*
、+
または?
)にaを追加すると、{n,m}
数量子が無効になります。