如何让 Zsh 在参数扩展中解释 \n

如何让 Zsh 在参数扩展中解释 \n

我在用着Zsh 的参数扩展标志将字符串拆分为数组。

这有效:

string="one
two"
array=("${(f)string}")
echo "${array[1]}"

# Returns:
# one

这不起作用:

string="one\ntwo"
array=("${(f)string}")
echo "${array[1]}"

# Returns:
# one
# two

我们怎样才能使扩展将 解释\n为换行符?

答案1

zshexpn手册涵盖了此类操作;一个选项是e 参数扩展标志(与(f)分割相同的部分),但e 作为生成文字的一部分,会执行很多操作(参数扩展、命令替换和算术扩展)\n。或者也许您确实希望所有这些操纵发生?

% string="a\nb" ; print -l ${(f)${(e)string}}
a
b

更确切地说,g它仅处理由内置 echo 处理的转义序列:

% string="a\nb" ; array=( ${(f)${(g::)string}} ) ; print $array[2]
b

更准确的是仅按字面量进行拆分\n

% string="a\nb" ; print -l ${(s.\\n.)string}
a
b

相关内容