在ZSH中将段落分成多行

3

如何将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

and

d
e
f

我会得到
a d
b e
c f
2个回答

7
在zsh中,你可以输入:
array=( ${(s.
.)"$(cal)"} )

或者,使用eval函数:
eval $'array=( ${(s.\n.)"$(cal)"} )'

这里的 (s.smth.) 指定了要分割的表达式(没有模式,只有固定字符串。与 IFS 不同,(s.:::.) 将在 ::: 处分割,而 IFS=':::' 将在 : 处分割)。使用 eval 是为了将换行符放入 (s) 标志中,因为 (s.\n.) 表示按反斜杠后跟字母 "n" 分割。

4
жҲ–иҖ…еҸӘйңҖ${(f)"$(cal)"}гҖӮиҝҷйҮҢзҡ„fдёҺps:\n:зӣёеҗҢгҖӮеҗҺиҖ…иҝҳеұ•зӨәдәҶеҰӮдҪ•еңЁдҪҝз”Ёsж—¶дҪҝз”ЁвҖңиҪ¬д№үеӯ—з¬ҰвҖқпјҢиҖҢдёҚйңҖиҰҒдҪҝз”ЁevalгҖӮ - Chris Johnsen
1
你的第一个方法对我不起作用(我得到了一个数组元素中的所有内容),除非我像Chris在上面的评论中那样引用命令替换:"$(cat)" - Dennis Williamson
1
@Chris Johnsen 谢谢,我忘记了 p 并且不知道引用的方法。也许你应该发表自己的答案? - ZyX
错误,我是指 "$(cal)",但你已经懂了。 - Dennis Williamson

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。


第二个分号可以省略。 - ZyX
实际上,也要保存和恢复IFS:IFS=$'\n' array=($(cal 6 2010)) - rocky
@rocky:不,赋值语句不是这样工作的。如果你测试一下你发布的内容,你会发现IFS没有被恢复。这只适用于“简单命令”的情况,例如IFS=$'\n' read -r var - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接