nullマッチング正規表現がsedとgrepで異なる動作をするのはなぜですか?

nullマッチング正規表現がsedとgrepで異なる動作をするのはなぜですか?

たとえば、Debian または Debian 派生システムのツールを使用すると、空のN*文字列に一致する次の正規表現を sed で一致させることができます。

$ echo 'Hello' | sed 's/N*/ xx&xx /g'
  xxxx H xxxx e xxxx l xxxx l xxxx o xxxx

xxxxこれは、各文字列文字の前の空の一致(つまり、間に文字がない文字列)の正しい結果ですxx&xx(から6回Hello。末尾の改行は計算されず、一致しません)。

xxそして、文字(または文字グループ)が一致すると、および間に表示されますxx

$ echo  'Hello' | sed 's/e*/ xx&xx /g'
 xxxx H xxexx l xxxx l xxxx o xxxx

しかし、grepの同じ正規表現はいいえ空の文字列と一致します。

$ echo 'Hello' | grep -o 'N*'

しかし印刷します。ただ空でない一致:

$ echo 'Hello' | grep -o 'e*'
e

正規表現の一致を避けるためにgrepに追加の内部ルールがありますかempty

ベストアンサー1

grep -ogrep --help次のように記録

  -o, --only-matching       show only nonempty parts of lines that match

そしてマニュアルに〜のように

一致する行の一致する(空でない)部分のみが印刷され、各部分は別々の出力行に表示されます。

はい。追加のルールがありますgrep -o。一致が空でない場合のみ出力されます。

ではecho 'Hello' | grep -o 'N*'正規表現は一致しますが(戻りコードを表示または使用してわかりますecho 'Hello' | grep 'N*')、一致は空であるため何も出力されません。

おすすめ記事