개행으로 구분된 단어가 포함된 문자열을 배열에 넣습니다.

개행으로 구분된 단어가 포함된 문자열을 배열에 넣습니다.

bash현재 다음과 유사한 문자열을 보유하는 변수가 있습니다 .
여기서 각각의 다른 문구는 줄 바꿈으로 구분됩니다.

var="1st word
2nd word

4th word"

"2nd word"와 사이에는 공백이 있습니다 "4th word".

두 번째 인덱스에 빈 문자열을 유지하면서 이 문구를 배열에 넣고 싶습니다.
arr=("1st word" "2nd word" "" "4th word")

다음 코드를 시도했지만 공백을 무시하는 것 같습니다.
IFS=$'\n' read -rd '' -a arr <<<"$var"

이 문제에 대한 해결책을 갖고 있는 사람이 있나요?

감사해요.

답변1

접근 방식의 문제점은 사용에 의존한다는 것입니다.IFS 공백 문자(즉, 개행 문자). 에 명시된 바와 같이 man bash:

                       Any  character  in IFS that is not IFS whitespace,
   along with any adjacent IFS whitespace characters, delimits a field.  A
   sequence  of  IFS whitespace characters is also treated as a delimiter.

따라서 에 전달하는 모든 옵션은 3개의 토큰으로 분할 read되어 "$var"비어 있는 세 번째 줄의 양쪽에 있는 인접한 줄 바꿈을 단일 구분 기호로 처리합니다.

Bash 버전 4.0부터 readarray(또는 동의어 mapfile)를 사용하여 전체 줄을 읽을 수 있습니다.

$ var="1st word
2nd word

4th word"

$ readarray -t arr <<<"$var"

$ declare -p arr
declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")

bash가 너무 오래되어 readarray/를 제공할 수 없다면 mapfile루프를 사용하여 이를 수행할 수 있습니다.

$ arr=()
$ while IFS= read -r line; do arr+=("$line"); done <<<"$var"

$ declare -p arr
declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")

관련 정보