改行で区切られた単語を含む文字列を配列に配置します。

改行で区切られた単語を含む文字列を配列に配置します。

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つのトークンに分割され、空のread3"$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")

おすすめ記事