テキストファイルの各個々の行全体を配列に保存するには?

テキストファイルの各個々の行全体を配列に保存するには?

「三語」というファイルがあります。これには次の情報が含まれます。

\#gray speedy bee

gr-A | sp-E-d-E | b-E

\#gray greedy pea

gr-A | gr-E-d-E | p-E

コマンドを実行するとき:

cat threewords | grep ^# | cut -c2-

このコマンドは # で始まる 2 行を取得します。次に#を削除し、それを出力に返します。

gray speedy bee

gray greedy pea

コマンドを実行するとき:

array=($(cat threewords | grep ^# | cut -c2-))

配列を作成しますが、次のようにすべての単語を別々の配列位置に分割します。

array[0] = gray,
array[1] = speedy,
array[2] = bee,
array[3] = gray,
array[4] = greedy,
array[5] = pea

各行の出力を次の配列に入れるようにコードを調べることができます。

array[0] = gray speedy bee, 
array[1] = gray greedy pea

ベストアンサー1

分割は、IFS区切り文字(デフォルトではスペース、改行、タブを含む)を使用して行われます。改行のみに設定IFS

$ IFS=$'\n' a=($(printf "1 2\n2 3\n"))
$ echo ${a[0]}
1 2
$ echo ${a[1]}
2 3

これはIFSシェルによって変わるので、最初に保存して復元するのが最善です。

OLD_IFS="$IFS"
IFS=$'\n' array=($(grep '^#' threewords | cut -c2-))
IFS="$OLD_IFS"

これを行う理由はまったくありません。

cat threewords | grep '^#'

grepファイルを完全に読み取ることができる:

grep '^#' threewords

〜のようにスティーブンコマンド出力の追加のシェル拡張を実行するときは、次のようにワイルドカードを無効にする必要がありますset -f

$ help set 
...
      -f  Disable file name generation (globbing).

それ以外の場合:

$ cd /; a=( $(printf "*\n") )
$ echo ${a[@]}
bin boot cdrom dev etc home ...

おすすめ記事