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