この例では、次のように説明します。 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規格。
grep
OpenBSD 6.4では、次のことが起こります。
$ grep -E '*hello'
grep: repetition-operator operand invalid
GNUは以下grep
を完全に無視しているようです*
。
$ printf 'hello\n' | ggrep -E '*hello'
hello
~によると同じ規格、デフォルトの正規表現(なしgrep
)-E
を使用する場合、*
式またはサブ式の先頭\(...\)
(または最初の文字の直後^
)は次のようになります。文字通り解釈される*
。