我知道如何在可打印分隔符上拆分字符串;例如,如果分隔符是,
:
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,我的 shell 版本是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}