制御文字に基づいて文字列を分割する方法は?

制御文字に基づいて文字列を分割する方法は?

たとえば、区切り文字が次の場合、印刷可能な区切り文字に文字列を分割する方法を知っています,

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}

関連情報