将段落拆分为ZSH中的行

时间:2010-06-29 15:51:51

标签: 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" "       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

d
e
f

我最终会以

结束
a d
b e
c f

2 个答案:

答案 0 :(得分:6)

这是一个可以在zsh和Bash中使用的进程替换示例。它使用Unix / Linux工具paste并排放置两个日历作为演示。

$ 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

直接回答您的问题:

saveIFS=$IFS; IFS=$'\n'; array=($(cal 6 2010)); IFS=$saveIFS

哪个也适用于Bash。

答案 1 :(得分:6)

在zsh中,您可以输入

array=( ${(s.
.)"$(cal)"} )

或者,使用eval:

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

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