如何在某些不可打印字符分隔符处拆分字符串?

kjo*_*kjo 1 zsh

我知道如果$VAR包含一些字符串,我可以将这个字符串拆分为句点,以生成一个数组,如下所示:

% VAR=$ZSH_VERSION
% parts=(${(s:.:)VAR})
% printf '%s\n' $parts
5
0
7
Run Code Online (Sandbox Code Playgroud)

我必须:(s::)标志之间放什么才能将$VARat 字符的值与 ASCII 代码 0分开,比如说?

我已经尝试了所有我能想到的。例如

% VAR=$'5\0000\0007'
% parts=(${(s:\000:)VAR})
% printf '%s\n' $parts
5^@0^@7
Run Code Online (Sandbox Code Playgroud)

它都不起作用。

cuo*_*glm 5

您需要使用pflag 使其他扩展标志(如下p)识别转义序列:

$ printf '%s\n' ${(ps:\0:)VAR}
5
0
7
Run Code Online (Sandbox Code Playgroud)

或使用速记:

printf '%s\n' ${(0)VAR}
Run Code Online (Sandbox Code Playgroud)

保留空元素:

printf '%s\n' "${(0@)VAR}"
Run Code Online (Sandbox Code Playgroud)

但是您不能将它用于输出find ... -print0,因为它\0在输出中添加了尾随,您将始终获得最后一个空元素。