String 在ZSH中将段落分成几行

String 在ZSH中将段落分成几行,string,shell,zsh,String,Shell,Zsh,如何在zsh中获取一个多行字符串,并将其拆分为一个字符串数组,每个字符串都是一行 具体地说,我想获取cal的输出 June 2010 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 把它变成 (" June 2010 " "Su Mo Tu We Th Fr Sa" "

如何在zsh中获取一个多行字符串,并将其拆分为一个字符串数组,每个字符串都是一行

具体地说,我想获取cal的输出

      June 2010     
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
把它变成

("      June 2010     " "Su Mo Tu We Th Fr Sa" "       1  2  3  4  5"  " 6  7  8  9 10 11 12" "13 14 15 16 17 18 19" "20 21 22 23 24 25 26" "27 28 29 30")
这是一个zsh数组


我的最终目标是获取另一个命令的输出并将它们并排放置,因此如果

a
b
c

我会以

a d
b e
c f

下面是一个在zsh和Bash中工作的进程替换示例。它使用Unix/Linux工具粘贴两个日历作为演示

$ paste <(cal 6 2009) <(cal 6 2010)

     June 2009               June 2010
Su Mo Tu We Th Fr Sa    Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6           1  2  3  4  5
 7  8  9 10 11 12 13     6  7  8  9 10 11 12
14 15 16 17 18 19 20    13 14 15 16 17 18 19
21 22 23 24 25 26 27    20 21 22 23 24 25 26
28 29 30                27 28 29 30
它也适用于Bash。

在zsh中,您可以键入

array=( ${(s.
.)"$(cal)"} )
或者,使用eval:

eval $'array=( ${(s.\n.)"$(cal)"} )'

此处
(s.smth.)
指定要拆分的表达式(没有模式,只有固定字符串。与IFS不同,
(s.:::)
将在
:::
上拆分,而
IFS='::'
将在
:::'上拆分)
eval
用于将换行符放入
(s)
标志中,因为
(s.\n.)
意味着在反斜杠上拆分,后跟字母«n»。

可以省略第二个分号。实际上,保存和恢复IFS也可以是:IFS=$'\n'数组=($(cal 6 2010))@rocky:不,分配不是这样的。如果您测试发布的内容,您将看到
IFS
不会被还原。这适用于“简单命令”的情况,例如
IFS=$'\n'read-rvar
,或仅
${(f)“$(cal)”}
f
ps:\n:
相同。后者还演示了如何在
s
中使用“Escape”(转义),而不必求助于
eval
。您的第一个转义不适用于我(我在一个数组元素中获取所有内容),除非我引用命令替换:
“$(cat)”
,就像Chris在上面的评论中所做的那样。@Chris Johnsen谢谢,忘记了
p
,不知道引用。也许你应该发布你自己的答案?呃,我的意思是“$(cal)”
,但你明白了。
array=( ${(s.
.)"$(cal)"} )
eval $'array=( ${(s.\n.)"$(cal)"} )'