*
私はここで非常にマイナーな問題に固執しました:bashでシンボルを意味する方法0以上、ツールのようなsed
?
たとえば、名前ak*
全体がa
ゼロ個以上のsでk
構成されているファイルはすべて一致する必要があります。拡張子には、およびが含まれますa
が、ak
含まれakk
ませakkk
んakc
。
私はこれをunsetopt sh_glob
zshとset -o noglob
bashで試しましたが、予想される動作を生成しません。
ベストアンサー1
とは別にksh93
、一般的に使用されるシェルには、ファイルの一致に使用できるsed、awkなどと同じ構文を持つ正規表現はありません。
Ksh93、bash、zshは構文が異なる正規表現を持ち、globと逆互換です。
?
単一文字と一致します(.
通常の正規表現構文と同じ)。[…]
ほぼ同じ方法で文字セットを一致させます。*(FOO)
ランダムな発生数の一致FOO
(通常の正規表現構文と同じ)(FOO)*
- また、1つ以上の項目と一致し、ゼロまたは1つの項目と一致します。
+(FOO)
?(FOO)
@(FOO|BAR)
一致FOO
するBAR
- 部分文字列ではなく文字列全体に対して一致が機能します。部分文字列が必要な場合は、
*
開始と終了に入れてください。
shopt -s extglob
この構文を使用するには、bashとzshで有効にする必要がありますsetopt ksh_glob
。だからbashでは、次のように書きます。
shopt -s extglob
ls a*(k)
また、見ることができます私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?
=~
Ksh93、zsh、bashは、拡張正規表現(デフォルトではawk構文)を含む生成された演算子を使用して、文字列の正規表現一致を実行できます[[ … ]]
。これはファイルのリストを表示するのに不便ですが、本当に必要に応じて行うことができます。
shopt -s dotglob # <<< include dot files, for bash
setopt globdots # <<< include dot files, for zsh
FIGNORE='@(.|..)' # <<< include dot files, for ksh
for x in *; do
if [[ $x =~ ^ak*$ ]]; then
…
fi
done