
find
私はLinuxコマンドの正規表現の使用について非常に混乱しています。
私はオプションがあることを知っていますがregextype
、それがなければ、現在のマニュアルページによると、Emacs正規表現を使用する必要があります。 このページ文字クラスがサポートされていると言うようです(「POSIX機能です」)。しかし、私の実験では、これが実際に文字クラスを処理する古代の方法であるという事実を除いて、それはうまくいかないかもしれません[[:ascii:]]
。代わりにこれを使用する必要があるようですが、これは他のもの以外はUnicode文字には役に立ちません。[[:digit:]]
[[:alnum:]]
[a-zA-Z]
だから私はregextype
に行き、可能な設定のリストを得ることができることを発見しましたfind -regextype help
。これは以下を提供します:
find: Unknown regular expression type ‘help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.
-regextype posix-basic
... たとえば、 を含めると、次のタスクを実行できると仮定します。
find . -maxdepth 1 -regextype posix-basic -regex .*\d.*
これは結果を生成しますが、私が期待した結果ではありません。現在、ディレクトリ内のすべてのファイルとフォルダ名には小文字の「d」があります!すべての名前には少なくとも1つの数字が必要です。
私はStack Exchangeでかなり多くのLinuxfind
正規表現の質問を見ましたが、「現代的な」文字クラスの処理を示す質問は見たことがないと思います。regextype
次のタスクを処理するオプションはありますか?
find . -maxdepth 1 -regextype ??? -regex '.*\d{3}\s+.*'
私の言葉は、「3桁の数字の後に1つ以上の空白文字が含まれています」です。つまり、Java、Python、Javascriptなどの一般言語の正規表現ルールと同じですか?
後でコメントに基づいて
以下は練習です。ディレクトリを作成し、その中に任意の名前のファイルをいくつか入れます。次に、「ctb117b」、「ctb117c」、「trt117a」という名前のファイルを追加します。
その後、「117」ファイルを分離したいと思います。 「xxx0009333qqq」というファイルがある可能性があります。したがって、最新の正規表現エンジンを使用すると、たとえば次のようになります(前の./許可)。
find . -regex './\w{3}\d\{3}.*'
これらの古いLinux正規表現ルールを使用して機能するには、何を書く必要がありますか?
find . -regextype posix-basic -regex '.*[[:digit:]]{3}.*'
何も生産されません。'.*[[:digit:]]+.*'
たとえば、どちらもありません。誰もが十分に興味があるなら、あなたに適したものを見せてください(上記のファイルリスト)。
答え1
私はこれを使用することをお勧めします:
find . -maxdepth 1 -regextype posix-extended -regex '.*[[:digit:]]{3}\s+.*'