Разделить абзац на строки в ZSH - PullRequest
3 голосов
/ 29 июня 2010

Как взять многострочную строку в 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 ]

6 голосов
/ 30 июня 2010

В Zsh вы можете набрать

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

или, с eval:

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

Здесь (s.smth.) указывает выражение для разделения (без шаблонов, только фиксированная строка. В отличие от IFS, (s.:::.) будет разделяться на :::, а IFS=':::' будет разделяться на :). eval используется для помещения символа новой строки внутри флага (s), поскольку (s.\n.) означает разделение на обратной косой черте, за которым следует буква «n».

6 голосов
/ 29 июня 2010

Вот пример замещения процесса, который будет работать в 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.

...