Bashで文字列を配列に分割する代替方法
配列
配列は、複数の値を1つの変数に格納するデータ構造です。各値は、インデックスと呼ばれる番号でアクセスされます。インデックスは、0から始まります。
Bash
Bashは、UnixおよびLinuxオペレーティングシステム用のコマンドシェルです。スクリプト言語としても使用できます。
split
splitコマンドは、ファイルを複数の小さなファイルに分割します。文字列を分割するのには直接使用できませんが、他の方法と組み合わせて使用することができます。
文字列を配列に分割する方法
文字列を配列に分割するには、いくつかの方法があります。以下はそのうちのいくつかです。
IFS変数を使用する
IFS変数は、入力フィールドセパレータを表します。デフォルトでは、IFS変数は空白文字(スペース、タブ、改行)で構成されています。IFS変数を変更することで、文字列を異なる区切り文字で分割することができます。
string="apple banana cherry"
IFS=" "
array=($string)
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
readコマンドを使用する
readコマンドは、標準入力から一行を読み込み、それを変数に格納します。readコマンドの-aオプションを使用すると、一行を配列に分割することができます。
string="apple banana cherry"
read -a array <<< "$string"
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
cutコマンドを使用する
cutコマンドは、ファイルまたは標準入力から特定のフィールドを抽出します。cutコマンドの-dオプションを使用すると、区切り文字を指定することができます。cutコマンドの-fオプションを使用すると、抽出するフィールドを指定することができます。
string="apple banana cherry"
array=($(cut -d " " -f 1-3 <<< "$string"))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
awkコマンドは、テキスト処理言語です。awkコマンドを使用して、文字列を分割し、配列に格納することができます。
string="apple banana cherry"
array=($(awk '{print $1,$2,$3}' <<< "$string"))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
string="apple banana cherry"
array=($(sed 's/[[:space:]]\+/ /g' <<< "$string" | tr ' ' '\n'))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
Bashで文字列を配列に分割する例
string="apple banana cherry"
IFS=" "
array=($string)
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
IFS
変数をスペースに設定することで、文字列をスペースで分割します。array=($string)
で分割された文字列を配列に格納します。
string="apple banana cherry"
read -a array <<< "$string"
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
read -a array
で文字列を配列に読み込みます。<<< "$string"
で文字列を標準入力にパイプします。
string="apple banana cherry"
array=($(cut -d " " -f 1-3 <<< "$string"))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
cut -d " " -f 1-3
で文字列をスペースで分割し、1から3番目のフィールドを抽出します。array=($(...))
で抽出されたフィールドを配列に格納します。
string="apple banana cherry"
array=($(awk '{print $1,$2,$3}' <<< "$string"))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
string="apple banana cherry"
array=($(sed 's/[[:space:]]\+/ /g' <<< "$string" | tr ' ' '\n'))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
sed 's/[[:space:]]\+/ /g'
で連続する空白文字を1つのスペースに置き換えます。tr ' ' '\n'
でスペースを改行に置き換えます。
string="apple banana cherry"
while IFS= read -r line; do
array+=("$line")
done <<< "$string"
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
read -r
コマンドを使用して、文字列を改行で分割し、配列に格納します。IFS=
で入力フィールドセパレータを空にすることで、改行以外の文字も分割されます。
mapfileコマンドを使用する
string="apple banana cherry"
mapfile -t array <<< "$string"
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
-t
オプションを使用して、末尾の改行を削除します。
parameter expansionを使用する
string="apple banana cherry"
array=(${string// / })
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
string="apple banana cherry"
array=($(tr ' ' '\n' <<< "$string"))
echo "${array[0]}" # apple
echo "${array[1]}" # banana
echo "${array[2]}" # cherry
- 説明:
arrays bash split