ZSH에 내장된 분할 연산자를 사용하여 이 작업을 수행하는 올바른 구문을 찾을 수 없습니다.https://zsh.sourceforge.io/Guide/zshguide05.html
이것은 작동하지만 echo/sed를 제거하려고 합니다.
for i in *;
do f=$(echo $i | sed 's/[-.]/ /g');
parts=(${(s: :)f}); echo $parts[1]; done
표현식에서 문자 세트를 지정하는 방법은 무엇입니까 parts=(${(s: :)f});
?
입력 문자열의 첫 번째 영숫자 하위 문자열을 찾으려고 합니다.
답변1
이것s[sep]
매개변수 확장 플래그패턴이 아닌 문자열(단일 문자일 필요는 없음)만 허용됩니다.
s
다음과 같은 방법으로 여러 연산자를 결합 할 수 있습니다 .중첩된 확장:
for file in *(N); do
parts=( ${(@s[-])${(s[.])file}} )
print -r The first part is $parts[1]
done
(또한 참고하세요(N)
글로벌 예선현재 작업 디렉토리에 숨겨지지 않은 파일이 없을 때 오류를 방지하기 위해).
아니면 당신은 사용할 수 있습니다IFS는 다음과 같이 분할됩니다.$=var
1:
IFS=.-
parts=( $=file )
parts=( ${(s[.])string} )
는 빈 요소를 삭제 하지만 나중에 삭제하거나 익명 함수를 사용할 IFS=.; parts=( $=string )
수는 있지만 그렇지는 않습니다 .parts=($=string); parts=($string)
(){ parts=($@); } $=string
또는 모든 문자를 1로 바꾸고 IFS 분할을 사용하여 분할하는 경우 ksh 스타일 또는 csh 스타일을 s[sep]
사용할 수 있지만 (사용${param//pattern/replacement}
histsubstpattern
존재하다) $param:gs/pattern/replacement/
:
parts=( ${(s[.])file//[-...]/.} )
이것이 필요한 첫 번째 부분인 경우 다음을 수행할 수 있습니다.
first_part=${file%%[.-]*}
ksh의 구문은 80년대의 구문과 같습니다.
하나 이상의 alnum의 첫 번째 시퀀스인 경우:
set -o extendedglob
first_sequence_of_alnums=${(MS)file##[[:alnum:]]##}
또는
if [[ $file =~ [[:alnum:]]+ ]]; then
first_sequence_of_alnums=$MATCH
else
print -ru2 "There are no alnums in $file"
fi
또는:
alnum_sequences=( ${(s[:])file//[^[:alnum:]]/:} )
if (( $#alnum_sequences > 0 )); then
first_sequence_of_alnums=$alnum_sequences[1]
else
print -ru2 "There are no alnums in $file"
fi
어쨌든 꼭 사용해야 한다면echo
,이건 아마도
echo -E - $file
그렇지 않으면 -E
백슬래시가 $file
깨질 수 있습니다. 그렇지 않은 경우 다음 과 같은 -
값에는 작동하지 않습니다 .$file
-n
-Eneene
print
: print -r -- $file
(또는 print -r - $file
). 더 중요한 것은 더 많은 옵션이 지원된다는 점 을 잊지 마십시오. --
그 중 일부는 위험할 수 있습니다.-
print
print
1 참고해주세요이것은 인용되지 않은 인수를 확장할 때 기본적으로 다른 Bourne 유사 쉘이 수행하는 작업 중 하나입니다., 종종 오류 기능으로 간주됩니다(그리고위험한 것!). zsh에서는 $=var
와일드카드를 명시적으로 요청해야 하는 것처럼 명시적으로 분할을 요청해야 합니다(다른 쉘에서 인용되지 않은 확장에서도 수행됨!) $~var
(또는 $=~var
둘 다).