여러 문자를 구분 기호로 사용하여 문자열을 분할하기 위한 ZSH 구문

여러 문자를 구분 기호로 사용하여 문자열을 분할하기 위한 ZSH 구문

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는 다음과 같이 분할됩니다.$=var1:

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 -Eneeneprint: print -r -- $file(또는 print -r - $file). 더 중요한 것은 더 많은 옵션이 지원된다는 점 을 잊지 마십시오. --그 중 일부는 위험할 수 있습니다.-printprint


1 참고해주세요이것은 인용되지 않은 인수를 확장할 때 기본적으로 다른 Bourne 유사 쉘이 수행하는 작업 중 하나입니다., 종종 오류 기능으로 간주됩니다(그리고위험한 것!). zsh에서는 $=var와일드카드를 명시적으로 요청해야 하는 것처럼 명시적으로 분할을 요청해야 합니다(다른 쉘에서 인용되지 않은 확장에서도 수행됨!) $~var(또는 $=~var둘 다).

관련 정보