如何在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
答案 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»。