207

最短の一致をgrepしたいので、パターンは次のようになります。

<car ... model=BMW ...>
...
...
...
</car>

...は任意の文字を意味し、入力は複数行です。

4

7 に答える 7

331

欲張りでない(または怠惰な)一致を探しています。?正規表現で貪欲でない一致を取得するには、数量詞の後に修飾子を使用する必要があります。たとえば、に変更でき.*ます.*?

デフォルトでgrepは、欲張りでない修飾子はサポートされていませんがgrep -P、Perl構文を使用するために使用できます。

于 2010-06-12T04:47:31.717 に答える
91

実際には.*?でのみ動作しperlます。同等のgrep拡張正規表現構文がどうなるかわかりません。幸い、grepでperl構文を使用できるので機能しますgrep -Pが、機能しないのgrep -Eと同じですegrep(貪欲になります)。

参照: http: //blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html

于 2011-04-25T01:26:43.467 に答える
18

このスレッドで何かを試した後に機能する私のgrep:

echo "hi how are you " | grep -shoP ".*? "

各行にスペースを追加してください

(私のものは単語を吐き出すための行ごとの検索でした)

于 2012-09-27T19:02:20.130 に答える
16

grep

欲張りでない一致のgrep場合は、否定された文字クラスを使用できます。つまり、ワイルドカードを使用しないようにしてください。

たとえば、ページコンテンツからjpegファイルへのすべてのリンクを取得するには、次を使用します。

grep -o '"[^" ]\+.jpg"'

複数の行を処理するには、最初に入力をパイプしますxargs。パフォーマンスについては、を使用してripgrepください。

于 2015-05-08T18:53:22.507 に答える
6

申し訳ありませんが、私は9年遅れていますが、これは2020年の視聴者にとってはうまくいく可能性があります。

したがって、のような行があるとします"Hello my name is Jello"。ここで、任意の数の文字を間に挟んで、で始まり、'H'で終わる単語を検索します。'o'そして、私たちは言葉が欲しいだけの行は必要ありません。そのために、次の式を使用できます。

grep "H[^ ]*o" file

これにより、すべての単語が返されます。これが機能する方法は次のとおりです。これにより、間にスペース文字ではなくすべての文字が許可されます。これにより、同じ行に複数の単語が含まれるのを防ぐことができます。

これで、スペース文字を他の任意の文字に置き換えることができます。最初の行が"Hello-my-name-is-Jello"であったとすると、次の式を使用して単語を取得できます。

grep "H[^-]*o" file
于 2020-03-24T13:12:36.797 に答える
3

簡単な答えは、次の正規表現を使用することです。

(?s)<car .*? model=BMW .*?>.*?</car>
  • (?s)-これは複数行で一致します
  • 。*?-任意の文字に、怠惰な方法で何度も一致します(最小限の一致)

(少し)もっと複雑な答えは次のとおりです。

(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>

これにより、次のテキストでcar1とcar2を一致させることができます。

<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
  • (..)はキャプチャグループを表します
  • このコンテキストでの\1は、グループ番号1をキャプチャすることによって最後に一致したものと同じテキストに一致します
于 2013-09-13T19:17:23.533 に答える
-1

私はそれが少し死んだポストであることを知っています、しかし私はちょうどこれがうまくいくことに気づきました。クリーンアップとクリーンアップの両方が出力から削除されました。

> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20
于 2020-03-09T08:35:38.923 に答える