예를 들어 구분 기호가 다음과 같은 경우 인쇄 가능한 구분 기호로 문자열을 분할하는 방법을 알고 있습니다 ,
.
FOO='x,y,z'
printf "%s\n" ${(s:,:)FOO}
x
y
z
그러나 구분 기호가 제어 문자(예를 들어)라면 어떻게 될까요 \034
? 예를 들어
FOO=$'x\034y\034z'
, 및 기타 몇 가지를 포함하여 제가 생각할 수 있는 모든 것을 :
한정자 에 넣으려고 시도했지만, 제가 시도한 어떤 것도 원래 문자열을 분할할 수 없었습니다.(s:...:)
\034
$'\034'
(허용할 수 없는 해결책은 전역 대체를 수행하여 원래 구분 기호의 모든 항목을 예를 들어 로 바꾼 ,
다음 결과 문자열을 (s:,:)
먼저 '$'\034'로 분할하는 것입니다. 구분 기호는 가능성을 줄이기 위한 것입니다. 구분 기호가 포함된 구분 텍스트의 경우 원래 구분 기호를 인쇄 가능한 구분 기호로 바꾸는 것은 이 원칙을 완전히 무너뜨리는 것입니다.
편집: 구분 기호를 변수에 넣는 것과 관련하여 다음 테스트 스크립트를 시도했습니다.
#!/usr/bin/env zsh
DELIM=$'\034'
FOO="x${DELIM}y${DELIM}z"
BAR=(${(ps:$DELIM:)FOO})
printf "%s\n" $BAR
BAZ=(${(ps:\034:)FOO})
printf "%s\n" $BAZ
내가 얻는 결과는 다음과 같습니다.
x^\y^\z
x
y
z
^\
( 터미널에서 인쇄하는 모습을 시뮬레이션하는 데 사용합니다 .)\034
FWIW, 내 쉘 버전은 zsh 5.0.7 (x86_64-pc-linux-gnu)
.
답변1
p
다음 플래그가 이스케이프 시퀀스를 인식하도록 하려면 플래그를 추가해야 합니다 .
$ FOO=$'x\034y\034z'
$ print -rl -- ${(ps:\034:)FOO}
x
y
z
구분 기호를 하드코딩하지 않으려는 경우(버전 >= 5.0.8 필요):
$ DELIM=$'\034'
print -rl -- ${(ps:$DELIM:)FOO}