/cygdrive/?/...
내 zsh 스크립트에서 내 작업 디렉터리가 다음으로 시작하는지 또는 정확히 일치하는지 알고 싶습니다 /cygdrive/?
(드라이브 문자(?)는 문자 c 이외의 문자일 수 있음). 그렇다면 두 변수 /cygdrive/?
부분 및 The 나머지를 검색합니다 /...
. 예: 내 작업 디렉토리가 이면 변수를 로 설정 하고 변수를 로 설정하고 /cygdrive/r/abc/xyz
싶습니다 . 예를 들어, PWD가 only인 경우 이 변수는 비어 있어야 합니다.head
/cygdrive/r
tail
/abc/xyz
/cygdrive/r
tail
나는 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
zsh
d-z
Glob은 또한 일치하는 항목만 사용되는 자체 패턴 일치를 사용하는 이점이 있는 defghijklmnopqrstuvwxyz
반면, =~
시스템의 정규식을 사용하면 훨씬 더 많은 문자(예: 헝가리 로케일의 문자 시퀀스 까지 ) [d-z]
를 일치시킬 수 있습니다 . 실행하면 PCRE를 사용 하게 되는데 , 이는 이와 관련하여 더 의미가 있습니다.é
dzs
set -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