最短の一致をgrepしたいので、パターンは次のようになります。
<car ... model=BMW ...>
...
...
...
</car>
...は任意の文字を意味し、入力は複数行です。
最短の一致をgrepしたいので、パターンは次のようになります。
<car ... model=BMW ...>
...
...
...
</car>
...は任意の文字を意味し、入力は複数行です。
欲張りでない(または怠惰な)一致を探しています。?
正規表現で貪欲でない一致を取得するには、数量詞の後に修飾子を使用する必要があります。たとえば、に変更でき.*
ます.*?
。
デフォルトでgrep
は、欲張りでない修飾子はサポートされていませんがgrep -P
、Perl構文を使用するために使用できます。
実際には.*?
でのみ動作しperl
ます。同等のgrep拡張正規表現構文がどうなるかわかりません。幸い、grepでperl構文を使用できるので機能しますgrep -P
が、機能しないのgrep -E
と同じですegrep
(貪欲になります)。
参照: http: //blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
このスレッドで何かを試した後に機能する私のgrep:
echo "hi how are you " | grep -shoP ".*? "
各行にスペースを追加してください
(私のものは単語を吐き出すための行ごとの検索でした)
grep
欲張りでない一致のgrep
場合は、否定された文字クラスを使用できます。つまり、ワイルドカードを使用しないようにしてください。
たとえば、ページコンテンツからjpegファイルへのすべてのリンクを取得するには、次を使用します。
grep -o '"[^" ]\+.jpg"'
複数の行を処理するには、最初に入力をパイプしますxargs
。パフォーマンスについては、を使用してripgrep
ください。
申し訳ありませんが、私は9年遅れていますが、これは2020年の視聴者にとってはうまくいく可能性があります。
したがって、のような行があるとします"Hello my name is Jello"
。ここで、任意の数の文字を間に挟んで、で始まり、'H'
で終わる単語を検索します。'o'
そして、私たちは言葉が欲しいだけの行は必要ありません。そのために、次の式を使用できます。
grep "H[^ ]*o" file
これにより、すべての単語が返されます。これが機能する方法は次のとおりです。これにより、間にスペース文字ではなくすべての文字が許可されます。これにより、同じ行に複数の単語が含まれるのを防ぐことができます。
これで、スペース文字を他の任意の文字に置き換えることができます。最初の行が"Hello-my-name-is-Jello"
であったとすると、次の式を使用して単語を取得できます。
grep "H[^-]*o" file
簡単な答えは、次の正規表現を使用することです。
(?s)<car .*? model=BMW .*?>.*?</car>
(少し)もっと複雑な答えは次のとおりです。
(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>
これにより、次のテキストでcar1とcar2を一致させることができます。
<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
私はそれが少し死んだポストであることを知っています、しかし私はちょうどこれがうまくいくことに気づきました。クリーンアップとクリーンアップの両方が出力から削除されました。
> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20