代码之家  ›  专栏  ›  技术社区  ›  Mike Cooper

在zsh中将段落拆分为行

  •  3
  • Mike Cooper  · 技术社区  · 14 年前

    如何在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 回复  |  直到 14 年前
        1
  •  5
  •   Dennis Williamson    14 年前

    下面是一个过程替换的例子,它将在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。

        2
  •  4
  •   ZyX    14 年前

    在zsh中,您可以键入

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

    或者,用EVA:

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

    在这里 (s.smth.) 指定要拆分的表达式(没有模式,只有固定字符串)。与IFS不同, (s.:::.) 将分裂 ::: ,同时 IFS=':::' 将分裂 : ) eval 用于将换行符放入 (s) 旗自 (s.\n.) 表示反斜杠上的拆分,后跟字母_