回答:
あなたは貪欲でない(または怠惰な)マッチを探しています。正規表現で貪欲でない一致を取得する?
には、数量詞の後に修飾子を使用する必要があります。たとえば、あなたが変更することができます.*
に.*?
.
デフォルトでgrep
は、貪欲でない修飾子はサポートされていませんがgrep -P
、Perl構文を使用できます。
.
改行を一致させることができるモードはDOTALLまたは単一行モードと呼ばれます。Rubyはmultilineと呼ばれる唯一のものです。他のフレーバーでは、マルチラインはアンカー(^
および$
)が行の境界で一致することを可能にするモードです。Rubyでは同等のモードがないため、Rubyでは常にそのように動作します。
-P
was a complete new one on me, I've been happily grepping away for years, and only using -E
... so many wasted years! - Note to self: Re-read Man pages as a (even more!) regular thing, you never digest enough switches and options.
grep
does not support -P
, but if you use egrep
you can use the .*?
pattern to achieve the same result. egrep -o 'start.*?end' text.html
-P
but -E
would call egrep
hence the suggested .*?
works just fine.
Actualy the .*?
only works in perl
. I am not sure what the equivalent grep extended regexp syntax would be. Fortunately you can use perl syntax with grep so grep -P
would work but grep -E
which is same as egrep
would not work (it would be greedy).
See also: http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
grep -P
does not work in GNU grep 2.9 -- just tried it (it doesnt error, just silently doesn't apply the ?
. Intertestly neither does the not class eg: env|grep '[^\=]*\='
grep -P
option or pgrep
command in Darwin/OS X 10.8 Mountain Lion, but egrep
works great.
pgrep
私のOS X 10.9ボックスにはコマンドがありますが、それは「名前でプロセスを検出またはシグナル通知する」ことを目的とする完全に異なるプログラムです。
このスレッドで何かを試した後に動作する私のgrep:
echo "hi how are you " | grep -shoP ".*? "
行のそれぞれにスペースを追加してください
(私は単語を吐き出すための行ごとの検索でした)
-shoP
ニーモニック:)
echo "bbbbb" | grep -shoP 'b.*?b'
少しの学習経験です。明示的に怠惰の面でも私のために働いた唯一のもの。
短い答えは次の正規表現を使用しています:
(?s)<car .*? model=BMW .*?>.*?</car>
(少し)より複雑な答えは次のとおりです。
(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>
これにより、次のテキストのcar1とcar2を一致させることができます。
<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
申し訳ありませんが9年遅れていますが、2020年の視聴者にはこれが役立つかもしれません。
したがって、次のような行があるとします"Hello my name is Jello"
。ここで、で始まり、'H'
で終わり'o'
、間に任意の数の文字がある単語を検索します。そして、私達は単にラインが欲しいのではなく、単にラインが欲しいのです。そのため、次の式を使用できます。
grep "H[^ ]*o" file
これはすべての単語を返します。これが機能する方法は、次のとおりです。その間にスペース文字の代わりにすべての文字を許可します。これにより、同じ行に複数の単語が含まれるのを回避できます。
これで、スペース文字を必要な他の文字に置き換えることができます。最初の行がだったとすると、次"Hello-my-name-is-Jello"
の式を使用して単語を取得できます。
grep "H[^-]*o" file
私はそれが少し死んだ投稿であることを知っていますが、これがうまくいくことに気づきました 出力からクリーンアップとクリーンアップの両方が削除されました。
> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20