正規表現の冒頭の「*」は何をしますか?

正規表現の冒頭の「*」は何をしますか?

この例では、次のように説明します。 find(GNU findutils) 4.5.11 grep(GNU grep) 2.20

複数のファイルを含むディレクトリがあるとします。私はjtobdops02.keyとjtobdops.02.cerというファイルを探したいと思います。

find . -regextype posix-extended -regex ".*jtobdops02\.(key|cer)"

以下を提供します。

./certs/jtobdops02.key

./certs/jtobdops02.cer

find . -type f | grep -E '.*jtobdops02.*(key|cer)'

また、期待どおりに提供されます。

./certs/jtobdops02.key

./certs/jtobdops02.cer

しかし、

find . -type f | grep -E '*jtobdops02.*(key|cer)'

これを考慮すると:

./資格証明/jtobdops02.key

./資格証明/jtobdops02.cer

発見者は次のように指摘した。

This is a match on the whole path, not a search.

grepの男はこう言います。

grep, egrep, fgrep - print lines matching a pattern

どちらも検索の代わりに一致を実行する場合、なぜ後者のgrepがまだ機能するのですか?また、後者の場合、grepには一致する先行サブ式がないので、*この場合何と一致しますか?カラー(太字)出力には違いは表示されないため、何もしないとします。この場合、エラーを報告する必要はありませんか?

次のうちどのような特徴があり、他のツールや言語で一般的な慣行は何ですか?

答え1

an で始まる拡張正規表現は、*以下を生成します。未定義の結果、によるとPOSIX規格

grepOpenBSD 6.4では、次のことが起こります。

$ grep -E '*hello'
grep: repetition-operator operand invalid

GNUは以下grepを完全に無視しているようです*

$ printf 'hello\n' | ggrep -E '*hello'
hello

~によると同じ規格、デフォルトの正規表現(なしgrep-Eを使用する場合、*式またはサブ式の先頭\(...\)(または最初の文字の直後^)は次のようになります。文字通り解釈される*

関連情報