3

私はファイルを持っていると言うfoo.txt

"The" "quick brown" "fox" "jumps over" "the" "lazy dog."

これらの「フィールド」をファイルから配列に読み込みたいと思います。ただし、フィールドにスペースがある場合、私の試みは失敗します

$ read -a bar < foo.txt

$ echo ${bar[0]}
"The"

$ echo ${bar[1]}
"quick
4

4 に答える 4

5

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 )

ファイル内のかっこは、コマンド置換の外で使用されるかっこのバランスを取り、その結果、ファイル内のそれらの間のテキストは、配列への入力に使用されるのではなく、コードとして実行されます。

于 2012-10-17T00:05:01.027 に答える
1

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"
于 2012-10-17T00:34:53.407 に答える
1

これは機能します

$ read < foo.txt

$ eval bar=($REPLY)

$ echo ${bar[0]}
The

$ echo ${bar[1]}
quick brown
于 2012-10-16T23:38:33.583 に答える
1

通常、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.". "単語では絶対に使用されないので、区切り記号として使用します。

于 2012-10-17T00:10:05.387 に答える