
bash
現在、次のような文字列を保持する変数があります。
ここで、他の各フレーズは改行で区切られています。
var="1st word
2nd word
4th word"
"2nd word"
との間にはスペースがあります"4th word"
。
2番目のインデックスに空の文字列を保持しながら、このフレーズを配列に入れたいと思います。
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
3"$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")