2013-11-04 2 views
32

찾았습니다. this입니다.새줄 문자로 bash 문자열 분할

그리고 내가 이것을 시도하고는 :

x='some 
    thing' 

y=(${x//\n/}) 

내가 운이 없었다, 나는 그것이 이중 백 슬래시와 함께 일할 수있는 생각 :

y=(${x//\\n/}) 

하지만하지 않았다.

echo ${y[1]} 

은 방법 : : 내가 원하는

some 
thing 

가 될 :

some 

난에 y을 원하는

것은 내가 내가 뭐하는 거지 원하는 것을 얻고 있지 않다 테스트하려면 배열 [some, thing]이어야합니다. 어떻게해야합니까?

+2

개행 문제를 해결하면 'some'은'$ {y [1]}'이 아니라'$ {y [0]}'에 저장됩니다. – chepner

답변

55

또 다른 방법 :

x=$'Some\nstring' 
readarray -t y <<<"$x" 

또는, bash는 4, bash는 3.2 해당이없는 경우 :

IFS=$'\n' read -rd '' -a y <<<"$x" 

당신은 그것을 당신이 처음에하고있었습니다 방법을도 수 : 당신의 문자열이 이미같은 공간을 포함하는 경우 그러나 이것은 제대로 작동하지 않습니다

y=(${x//$'\n'/ }) 

. 작동하려면, 당신은 그것을 구문 분석하기 전에 단어 분리기를 제한 할 필요가있다 : 당신이 구분을 변경하기 때문에

IFS=$'\n' y=(${x//$'\n'/ }) 

... 그리고, 당신은 더 이상 \nspace에 변환 할 필요가 없습니다, 그래서 그것이 일치하는 파일 이름 (들)에 의해 대체 될 경우 - $x (예 : "*"와 같은) 일치하는 글 로빙 패턴을 포함 하지 않는 한이 방법을 작동합니다

IFS=$'\n' y=($x) 

: 당신은 그것을 단순화 할 수 있습니다. read/readarray 방법은 새로운 bash 버전이 필요하지만 모든 경우에 사용할 수 있습니다.

+1

확장 패턴에서'\ n'의 인스턴스가'\\ n '과 일치하지 않습니다. 대신에'\ n' * 리터럴 * :'echo $ {x // $ '\ n'/}'에 이어 붙여야합니다. – mklement0

+0

@ mklement0 : 고마워, 편집. –

+2

'readArray' 접근법은 실제로'($ x)'가 여전히 globbing *에 종속되어 있기 때문에 * 가장 강력한 * 접근법입니다 : 어떤 행이 유효한 * 단일 토큰 * globbing 패턴 (예 :' *'), 파일이 일치하면 확장됩니다. 'readarray'는 bash * 4 *를 요구합니다; 여기에 bash 3.2 버전이 있습니다 (OS X의 경우) :'IFS = $ '\ n'read -rd "-a y <<<"$ x "'. 귀하의 게시물은 견인력을 얻고 있으므로이 결과를 추가 하시겠습니까? – mklement0