ZSHワイルドカード式に冗長制約を組み込む方法があるかどうかを知っている人はいますか?
たとえば、「ABC」で始まり、後に1つ以上の数字が続くすべてのファイルを一致させるには、grep oneを使用して次のようにします。
ls | grep -e "ABC[0-9]\+"
ZSH glob文字列を使用してこれを直接実行する方法はありますか?おおよそ次のようになります。
ls "ABC[0-9]\+"
私は探索しましたZSHドキュメント似たようなものを検索しましたが、今までそのようなサポートが見つかりませんでした。
これが可能かどうかを知っている人はいますか?
答え1
はい、次の##
項目が1つ以上の一致に使用されます[0-9]
。
ABC[0-9]##
このextendedglob
値を設定する必要があり、デフォルト値で十分です。設定されていない場合は、まず設定してください。
setopt extendedglob
例:
% print -l ABC*
ABC
ABC75475
ABC8
ABC90
% print -l ABC[0-9]##
ABC75475
ABC8
ABC90
答え2
下にスクロールして」ファイル名の生成」と活性化extended_glob
(これはデフォルトでなければなりませんが、以前のバージョンとの互換性のためではありません)ksh_glob
。 zsh 拡張 glob と ksh はどちらも正規表現のすべての機能を備えています。
ERE syntax ksh glob zsh extended glob
(foo)* *(foo) (foo)#
(foo)+ +(foo) (foo)##
(foo)? ?(foo) (|foo)
(foo|bar) @(foo|bar) (foo|bar)
正規表現を使用するほとんどのツールは、これを次のように使用することに注意してください。探す部分文字列と一致する必要があるパターンですが、globは常に文字列全体と一致する必要があるパターンとして使用されます。たとえば、一部のテキストが残っているため、foofoobar
zsh globと一致しません。(foo)##
foofoo
Zshには式機能を拡張するのではなく、特定の式を簡単に作成できる追加の演算子があります。演算子^
と~
(extended_glob
)と!(…)
(ksh_glob
)は否定を提供します。たとえば、or以外のすべての項目と一致します^foo
。これは正規表現構文では扱いにくいです。演算子(zsh固有、必須ではない)は範囲内のすべての整数と一致します。そうでないか。!(foo)
foo
|[^f].*|f[^o].*|fo[^o].*
<…-…>
extended_glob
<3-11>
3
10
30
1
そのため、文字を印刷できないなどの問題を排除し、ls | grep -e "ABC[0-9]\+"
次のような方法で作成できます。
print -lr -- *ABC[0-9]##*(N) # requires extended_glob
print -lr -- *ABC+([0-9])*(N) # requires ksh_glob
print -lr -- *ABC+<->(N)
しかし、「1つ以上の数字の次の何でも」は「数字の次の何でも」と同じなので、次のように書くこともできます.
print -lr -- *ABC[0-9]*(N)
答え3
起動後extendedglob
:
$ setopt extendedglob
$ print -rl -- perl[[:digit:]]##
perl5
またはkshglob
有効とbareglobqual
無効:
$ setopt kshglob
$ unsetopt bareglobqual
$ print -rl -- perl+([[:digit:]])
perl5
[:digit:]
現在のロケールで数値と見なされるすべての項目と一致します。一致さ0
せるには、リテラルを9
設定または使用します。LC_ALL=C
[0123456789]
たとえば、and演算子を使用できる任意の場所でglobbingフラグを{n,m}
使用して、正規表現の(#cN,M)
一致数を指定できます。#
##
(*/)#
(*/)##
$ print -rl -- perl[[:digit:]](#c1)
perl5
$ print -rl -- perl[[:digit:]](#c2)
zsh: no matches found: perl[[:digit:]](#c2)