2010-06-29 8 views
3

어떻게하면 zsh에서 여러 줄 문자열을 가져 와서 각각 한 줄짜리 문자열 배열로 나눌 수 있습니까?단락을 ZSH의 줄로 나누기

구체적 I 칼

 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을 배열이다

("  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") 

으로 우회전합니다.


내 궁극적 인 목표는 다른 명령의 출력을 가지고, 나란히 넣어 다음, 그래서 내가

a 
b 
c 

이 있다면
d 
e 
f 

내가 끝낼 것

a d 
b e 
c f 

답변

5

다음은 프로세스의 예입니다. zsh와 Bash에서 작동 할 대체. Unix/Linux 툴 paste을 사용하여 두 개의 캘린더를 데모로 나란히 배치합니다. 또한 배쉬에서 작동

saveIFS=$IFS; IFS=$'\n'; array=($(cal 6 2010)); IFS=$saveIFS 

:

$ 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 

직접 귀하의 질문에 대답합니다.

+0

두 번째 세미콜론은 생략 할 수 있습니다. – ZyX

+0

실제로 IFS 저장 및 복원 : IFS = $ '\ n'array = ($ (cal 6 2010)) – rocky

+0

@rocky : 아니요, 할당은 그렇게 작동하지 않습니다. 게시 한 것을 테스트하면'IFS'가 복원되지 않은 것을 볼 수 있습니다. 이것은 "간단한 명령"의 경우에 작동합니다. 'IFS = $ '\ n'read -r var'. –

3

zsh을, 당신은 평가와 함께,

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

를 입력하거나 할 수 있습니다 : 여기 (s.smth.)

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

는 (아무 패턴 만 고정 문자열을 분할하는 식을 지정 IFS는 달리, (s.:::.) 것. :::에서 분할하고, IFS=':::':에서 분할합니다. eval(s) 깃발 안에 개행 문자를 넣기 위해 사용됩니다. (s.\n.)은 역 슬래시로 나뉘어 뒤따라 오는 문자«n»를 의미하기 때문입니다.

+4

아니면'$ {(f) "$ (cal)"}'. 'f'는'ps : \ n :'과 같습니다. 나중에 "eval"에 의지하지 않고 "escapes"를's'와 함께 사용하는 방법도 보여줍니다. –

+1

커맨드 대체를 인용하지 않는 한 첫 번째 것은 저를 위해 작동하지 않습니다 (하나의 배열 요소에서 모든 것을 얻습니다) : 위의 코멘트에서 Chris **가했던 방식 인''$ (cat) '''입니다. –

+1

@Chris Johnsen 덕분에,'p'에 대해 잊어 버렸고 인용하는 것에 대해 몰랐습니다. 어쩌면 당신 자신의 답변을 게시해야합니까? – ZyX