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

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

/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

答え2

変数のサフィックスを取得する方法は既にわかっているので、変数からプレフィックスを削除してプレフィックスを持つことができます。

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

条件はZshで正規表現を使用できます。

if [[ $PWD =~ '^/cygdrive/[abd-z](/.*)?$' ]]
then
    tail=${PWD#/cygdrive/?}
    head=${PWD%%$tail}

    echo "head is $head"
    echo "tail is $tail"
else
    echo "no match"
fi

関連情報