正規表現について質問があります。
2つのコマンドがあります。
find / -regex '.*[^-_./0-9a-zA-Z].*'
find /
私が正しい場合は、両方のコマンドが同じ結果を出力する必要があります。なぜなら、最初のコマンドには.*
最初に現れる正規表現があるからです。これは、「すべての文字を検索し、そのうち0つ以上が表示される可能性がある」ことを意味します。これはすべてのファイル名を意味します。ファイル名はスペース("")を含む任意の文字で構成でき、ゼロ文字は不可能であるため(ファイルに名前がないことを意味します)。だから結局同じ結果が出たようです。
しかし、「結果ライン出力」を意味するとともに、これらのコマンドを使用すると| wc -l
結果が異なります。
私は何を逃したことがありませんか?
答え1
例は次のとおりです。 * .* は 0 個以上の任意文字を意味します。 2 番目のケースでは、除外されていない文字の 1 つが次の 0 文字と一致します。
ls
1 a =a ++a a.0 a_1 B b0
find .
.
./B
./=a
./b0
./a_1
./a
./1
./a.0
./++a
find . -regex '.*[^-_./0-9a-zA-Z].*'
./=a
./++a
答え2
.*
その後には - が来て[^-_./0-9a-zA-Z]
、選択肢ではありません。したがって、これらの文字の1つ以外の文字(文字、数字、、、、および)をファイル名に一度表示する必要が-
あります。これらの文字のみで構成されたパスは印刷されません。_
.
/
したがって、これらのコマンドは同じ結果を出力する必要はありません。