ファイルから空白を含む引用配列要素を読みますか?

ファイルから空白を含む引用配列要素を読みますか?

以下を使用してデータをSTDIN配列に渡します。read

prompt$ cat myfile
a "bc" "d e" f
prompt$ read -a arr < myfile

しかし、read引用された文字列に注意を払わないようで、5つの要素を持つ配列を提供します。

prompt$ echo ${#arr[@]}
5
prompt$ echo ${arr[@]:0}
a "bc" "d e" f
prompt$ echo ${arr[2]}
"d
prompt$ echo ${arr[3]}
e"

私はデフォルト値IFS\t\ninを使用していますbash。さまざまなツールを使用してタスクを実行する方法はいくつかありますが、読み取りが引用符付き文字列をサポートしていないことに驚きました。

引用符で区切られたリストを配列に入れることに関する他の提案はありますか?

答え1

私はあなたが必要とするものを達成するための良い方法を考えることはできませんが、入力ファイルにbashに有効な構文であるスペースで区切られたトークンが含まれていることを知っている場合は、次のように動作します。

declare -a arr="($(<myfile))"

答え2

これを使用してください:

IFS=$'\n' arr=( $(xargs -n1 <file) )
  • IFS=$'\n'Bash 内部フィールド区切り文字を改行に設定します。
  • arr=( ... )配列定義。
  • xargs -n1 <file xargs最大1つのパラメータを読み取りますfile。引用符内の文字列は、パラメータとして読み込まれると一緒に保持されます。

出力(1行に1つの要素):

$ printf "%s\n" "${arr[@]}"
a
bc
d e
f

関連情報