将段落拆分为ZSH中的行

Mik*_*per 3 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
Run Code Online (Sandbox Code Playgroud)

把它变成

("      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")
Run Code Online (Sandbox Code Playgroud)

这是一个zsh数组.


我的最终目标是接受另一个命令的输出并将它们并排放置,所以如果我有的话

a
b
c
Run Code Online (Sandbox Code Playgroud)

d
e
f
Run Code Online (Sandbox Code Playgroud)

我最终会

a d
b e
c f
Run Code Online (Sandbox Code Playgroud)

Pau*_*ce. 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
Run Code Online (Sandbox Code Playgroud)

直接回答你的问题:

saveIFS=$IFS; IFS=$'\n'; array=($(cal 6 2010)); IFS=$saveIFS
Run Code Online (Sandbox Code Playgroud)

哪个也适用于Bash.


ZyX*_*ZyX 6

在zsh中,您可以输入

array=( ${(s.
.)"$(cal)"} )
Run Code Online (Sandbox Code Playgroud)

或者,与eval一起:

eval $'array=( ${(s.\n.)"$(cal)"} )'
Run Code Online (Sandbox Code Playgroud)

这里(s.smth.)指定要分割的表达式(没有模式,只有固定的字符串。与IFS不同,(s.:::.)将分割为:::,而IFS=':::'分割为:)。eval用于将换行符放入(s)标记内,因为该(s.\n.)方法在反斜杠上分割,后跟字母“ n”。

  • 或者只是`$ {(f)“ $(cal)”}`。f与ps:\ n:相同。后面的内容还显示了如何在不使用eval的情况下将s与e一起使用。 (4认同)