![개행으로 구분된 단어가 포함된 문자열을 배열에 넣습니다.](https://linux55.com/image/193669/%EA%B0%9C%ED%96%89%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%EB%8B%A8%EC%96%B4%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%B0%B0%EC%97%B4%EC%97%90%20%EB%84%A3%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
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")