如何根据控制字符分割字符串?

如何根据控制字符分割字符串?

我知道如何在可打印分隔符上拆分字符串;例如,如果分隔符是,

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}

相关内容