パスをファイル名に分割[閉じる]

パスをファイル名に分割[閉じる]

/cygdrive/?/...私のzshスクリプトで、私の作業ディレクトリが次に始まるかどうか、または正確に一致するかどうかを知りたいです/cygdrive/?(ドライブ文字(?)は文字c以外の文字かもしれません)。その場合は、2つの変数/cygdrive/?部分とThe残りを検索します/...。例:私の作業ディレクトリがある場合は、変数をに設定し、変数をに設定したいと/cygdrive/r/abc/xyz思います。たとえば、PWDがonlyの場合、この変数は空でなければなりません。head/cygdrive/rtail/abc/xyz/cygdrive/rtail

私はzsh内部コマンドのみを使用するソリューションを好みます。つまり、生成プロセスは必要ありません。

私は仕事をする次の解決策を思いついたが、気に入らない。

if [[ $PWD == /cygdrive/[abd-z]* ]]
then
  local head=${PWD:0:11}
  local tail=${PWD#/cygdrive/?}
  ....
fi

特にハードコーディングされた値が11のhead計算が気に入らず、まったく異なるアプローチがあればもう少しエレガントになるのではないかと思います。

if更新:たとえば、PWDがある場合、私の条件も本当であることを知っていますが、私の/cygdrive/fooアプリケーションではこれは問題ではないと思います。もちろん、条件を作成するためのより良い選択肢を提案できれば、正確に私が望むことをやっており、すべてのコメントに感謝します。

ベストアンサー1

if [[ $PWD =~ '^(/cygdrive/[abd-z])(.*)' ]]; then
  head=$match[1]
  tail=$match[2]
fi

グローバルと同じ:

set -o extendedglob
if [[ $PWD = (#b)(/cygdrive/[abd-z])(*) ]]; then
  head=$match[1]
  tail=$match[2]
fi

zshd-zGlobには、一致するものだけが使用される独自のパターンマッチングを使用する利点がありますが、defghijklmnopqrstuvwxyzシステム=~の正規表現を使用すると、はるかに多くの文字(ハンガリーのロケールの文字シーケンスまで)を[d-z]一致させることができます。実行するとPCREを使用することになりますが、これに関してはより意味があります。édzsset -o rematchpcre=~

不一致/cygdrive/foo:

if [[ $PWD =~ '^(/cygdrive/[abd-z])(/.*)?$' ]]; then
  head=$match[1]
  tail=$match[2]
fi

ボールで:

set -o extendedglob
if [[ $PWD = (#b)(/cygdrive/[abd-z])(/*|) ]]; then
  head=$match[1]
  tail=$match[2]
fi

おすすめ記事