제어 문자를 기준으로 문자열을 분할하는 방법은 무엇입니까?

제어 문자를 기준으로 문자열을 분할하는 방법은 무엇입니까?

예를 들어 구분 기호가 다음과 같은 경우 인쇄 가능한 구분 기호로 문자열을 분할하는 방법을 알고 있습니다 ,.

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}

관련 정보