シェルワイルドカードでゼロ個以上の演算子を一致させます。

シェルワイルドカードでゼロ個以上の演算子を一致させます。

*私はここで非常にマイナーな問題に固執しました:bashでシンボルを意味する方法0以上、ツールのようなsed

たとえば、名前ak*全体がaゼロ個以上のsでk構成されているファイルはすべて一致する必要があります。拡張子には、およびが含まれますaが、ak含まれakkませakkkakc

私はこれをunsetopt sh_globzshとset -o noglobbashで試しましたが、予想される動作を生成しません。

ベストアンサー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

おすすめ記事