私はファイルを持っていると言うfoo.txt
"The" "quick brown" "fox" "jumps over" "the" "lazy dog."
これらの「フィールド」をファイルから配列に読み込みたいと思います。ただし、フィールドにスペースがある場合、私の試みは失敗します
$ read -a bar < foo.txt
$ echo ${bar[0]}
"The"
$ echo ${bar[1]}
"quick
declare
の代わりに使用eval
:
declare -a "bar=( $( < foo.txt ) )"
これにより、ファイル内のすべてが割り当ての右側として扱われます。を使用eval
すると、ファイルの内容をコードとして解釈できます。たとえば、ファイルに
Some text ); echo "you just erased all your files"; ( true
次に、以下が によって実行されeval
ます。
bar=( Some text ); echo "you just erased all your files"; ( true )
ファイル内のかっこは、コマンド置換の外で使用されるかっこのバランスを取り、その結果、ファイル内のそれらの間のテキストは、配列への入力に使用されるのではなく、コードとして実行されます。
FPAT変数を使用する 1 つの方法をGNU awk
次に示します。
IFS=$'\n'
array=($(awk 'BEGIN { FPAT = "([^ ]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }' file.txt))
echo "${array[1]}"
結果:
"quick brown"
これは機能します
$ read < foo.txt
$ eval bar=($REPLY)
$ echo ${bar[0]}
The
$ echo ${bar[1]}
quick brown
通常、bash は入力フィールドの区切りに空白を使用するため、ソリューションは失敗しますIFS
(これが引用符を取得する理由でもあります)。
read
処理するテキストを準備する場合は、plain を使用できます。
IFS='"'
read -a bar < <(sed 's/"\([^"]*\)" */\1"/g' foo.txt)
echo ${bar[1]}
quick brown
注: sed コマンドは、ファイルを次の形式に変換します: The"quick brown"fox"jumps over"the"lazy dog."
. "
単語では絶対に使用されないので、区切り記号として使用します。