String 在ZSH中将段落分成几行
如何在zsh中获取一个多行字符串,并将其拆分为一个字符串数组,每个字符串都是一行 具体地说,我想获取cal的输出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" "
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)"} )'