zsh 在垂直选项卡上分割字符串

问题描述 投票:0回答:1

我有一个程序可以生成包含垂直制表符的输出。在 zsh 中,通过程序输出获得的垂直制表符在某种程度上与在终端输入的垂直制表符略有不同。以下程序演示了这一点:

# Create two variables with the same content (both with a vertical tab)
# However one is from a string literal and the other is created using a program 
a='a\vb'
echo -n "$a" > a.tmp
b="$(cat a.tmp)"

# The hexdump of the two variables is the same
echo -n "$a" | hexdump -C
echo -n "$b" | hexdump -C

# However, they are not equal to each other
[[ "$a" == "$b" ]] && echo "equal" || echo "not equal"

# And the second variable cannot be split on the vertical tab
echo -n "${(@s:\v:)a}" | hexdump -C
echo -n "${(@s:\v:)b}" | hexdump -C

因此,变量具有相同的内容(通过十六进制转储检查)但不相等,特别是垂直制表符在某种程度上不是第二个变量中的实际垂直制表符(因为它无法拆分)。

如何拆分伪垂直选项卡上的第二个字符串?到底是什么角色?

zsh 版本是 zsh-5.9-0-g73d3173,在 macOS 上运行,没有任何额外安装(没有 Oh-My-ZSH)。我无法更改程序的输出以不包含垂直制表符。我考虑过使用

tr
来转换垂直制表符,但该程序可以生成大多数其他字符,并且这些字符不应分开。

split zsh control-characters
1个回答
0
投票

\v
实际上是一个斜杠,后面跟着一个v。正是
echo
评估了
\v
,这就是为什么
hexdump
认为它们是相同的。显然,它不需要
-e
来解释反斜杠。

拆分不起作用的原因是它不解释反斜杠,但是可以将其更改为

ps
,这会导致拆分字符串按照 https://zsh.sourceforge.io/Doc 解释反斜杠/Release/Expansion.html(“p - 识别与 print 内置相同的转义序列”)。

因此分割重写为:

"${(@ps:\v:)a}"
© www.soinside.com 2019 - 2024. All rights reserved.