akaikasa
@akaikasa

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

シェルスクリプトで以下のような空白行区切りの文字列を配列に格納したいです

シェルスクリプトで以下のような空白行区切りの文字列を配列に格納したいです。

test.txt
~~~~~~
red 1 2
blue 2 3

dog 2 3 4
cat 2 9

aiueo
~~~~~~

実行したいことは以下のようにArray配列に入れたいです。
Array[0]=
red 1 2
blue 2 3

Array[1]=
dog 2 3 4
cat 2 9

Array[2]=
a 1 2
i 3 4 5

よろしくお願いします。

0

2Answer

Ruby を使ってよければ以下のコマンドでできます。 Ruby でファイルを読み込んで分割し、 配列の要素を(シェルの特殊文字をエスケープした形で)出力して、それを配列に代入する Bash コマンド文字列を組み立てて eval しています。

eval "Array=($(ruby -rshellwords -e 'puts IO.read("test.txt").split(/\n\n/).map(&:shellescape).join(" ")'))"
bash-3.2$ eval "Array=($(ruby -rshellwords -e 'puts IO.read("test.txt").split(/\n\n/).map(&:shellescape).join(" ")'))"
bash-3.2$ echo "${Array[0]}"
red 1 2
blue 2 3
bash-3.2$ echo "${Array[1]}"
dog 2 3 4
cat 2 9
bash-3.2$ echo "${Array[2]}"
aiueo
0Like

Comments

  1. @akaikasa

    Questioner

    シェルスクリプトで実現したいです。

Bash だけでやるならこうしてください。

Array=()
i=0

while IFS= read -r line; do
    if [[ "$line" = "" ]]; then
        i=$(( i+1 ))
        continue
    fi
    if [[ "${Array[$i]}" = "" ]]; then
        Array[$i]="$line"
    else
        Array[$i]="${Array[$i]}
$line" # 行頭に余計な空白が入らないようインデントしない
    fi
done < tmp.txt

0Like

Your answer might help someone💌