2017-02-06 12 views
3

나는 같이 배열로 전체 파일을 읽는 나에게 도움이 될 $'\n'에 IFS를 설정하는 생각 , 그리고 아무것도.

심지어이 배열에 첫 번째 줄을 읽

string=$'one\ntwo\nthree' 
IFS=$'\n' read -r -a array <<< "$string" 

내가 배열로 파일을 읽을 mapfile -t 또는 read 루프를 사용하여 하나에 대해 얘기이 사이트의 다른 게시물을 가로 질러왔다.

내 질문 : 언제 IFS=$'\n'을 사용합니까?

답변

3

귀하의 거의 작동하지만, 당신이 단지 줄 바꿈 (기본 동작)까지 읽을 것을 read 말할 필요하지만, 예를 들어, 널 문자열까지 시도 둘째 :

$ IFS=$'\n' read -a arr -d '' <<< $'a b c\nd e f\ng h i' 
$ declare -p arr 
declare -a arr='([0]="a b c" [1]="d e f" [2]="g h i")' 

그러나 당신이 지적 아웃 mapfile/readarray 당신이 그것을있는 경우에 갈 수있는 방법이다 (배쉬 4.0 이상이 필요합니다) :

$ mapfile -t arr <<< $'a b c\nd e f\ng h i' 
$ declare -p arr 
declare -a arr='([0]="a b c" [1]="d e f" [2]="g h i")' 

-t 옵션은 각 요소에서 줄 바꿈을 제거합니다. 사용할 줄 경우에 관해서는

IFS=$'\n' :

  • 당신이 배열로 파일을 읽고 싶은 경우처럼, 같이, 요소마다 1 개 라인, 배시가 4.0보다 오래된 경우, 그리고 루프를 사용하지 않으려는 경우 단어 분리로 인한 예기치 않은 부작용을 피하기 위해 공간을 사용하지 않고 IFS을 사용하여 루프를 사용하고 싶지 않습니다. 내 생각에 적절한 접근법은 단어 분할을 이해하고 원하는대로 적절한 인용을 사용하지 않도록하십시오.
  • 예를 들어 the one for cd in bash-completion과 같이 탭 완성 스크립트에 IFS=$'\n'이 사용되었습니다.이 스크립트는 경로를 사용하지 않고 콜론을 줄 바꿈으로 바꾼 다음 IFS을 사용하여 분할합니다.
3

로 약간 혼란 스럽습니다. IFS. IFS내부는 필드 분리가 단어 진출 후 워드 분할에 분할 선 프리폼 배시에 의해 사용된다. 기본값은 [ \t\n] (공백, 탭, 줄 바꿈)입니다.

IFS=$'\n'을 재 할당하면가 제거되고 bash는 newline 자로 만 단어를 분할합니다. (당신의 생각은 정확합니다). 이는 을 따옴표없이 단일 배열 요소로 읽을 수있게하는 효과가 있습니다.

구현이 실패한 곳은 read -r -a array < file입니다.-a 행의 단어 을 순차 배열 인덱스에 할당합니다. 그러나, bash에게 단지 newline (전체 행)을 중단하라고 지시했습니다. 당신은 한번만 read를 호출하기 때문에 하나의 배열 인덱스 만 채워집니다.

는 당신도 할 수있다 :

while IFS=$'\n' read -r line; do 
    array+=($line) 
done < "$filename" 

(당신은 단순히 "$line"을 인용 한 경우 IFS을 변경하지 않고 할 수있는)

또는 IFS=$'\n'를 사용하여, 당신은 마지막으로

IFS=$'\n' 
array=($(<filename)) 

또는를 할 수 IFSreadarray을 사용할 수 있습니다.

readarray array <filename 

질문이 있으시면 알려주세요.

+0

'array = $ ($ (

+0

Duh - thank you':)' –

+0

Benjamin과 David 모두 감사합니다. 귀하의 답변은 저에게 큰 도움이되었습니다. – learningbee