경로를 파일 이름으로 분할 [닫기]

경로를 파일 이름으로 분할 [닫기]

/cygdrive/?/...내 zsh 스크립트에서 내 작업 디렉터리가 다음으로 시작하는지 또는 정확히 일치하는지 알고 싶습니다 /cygdrive/?(드라이브 문자(?)는 문자 c 이외의 문자일 수 있음). 그렇다면 두 변수 /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

관련 정보