Bash で文字列を分割
-
Bash で文字列を分割するための
tr
コマンドの使い方 -
Bash で
IFS
を使用して文字列を分割する -
Bash で
read
コマンドを使用して文字列を分割する - Bash でパラメータ展開を使用して文字列を分割する
-
Bash で
cut
コマンドを使用して文字列を分割する
このチュートリアルでは、tr
コマンド、IFS
、read
コマンド、パラメーター展開、および cut
コマンドを使用して、bash の区切り文字で文字列を分割する方法を示します。
Bash で文字列を分割するための tr
コマンドの使い方
tr
コマンドは translate
の短縮形です。標準入力から文字を変換、削除、および絞り込み、結果を標準出力に書き込みます。
これは、コマンドラインまたは bash スクリプトでテキストを操作するための便利なコマンドです。繰り返される文字を削除したり、小文字を大文字に変換したり、文字を置き換えたりすることができます。
以下の bash スクリプトでは、echo
コマンドが文字列変数 $addrs
を tr
コマンドにパイプします。このコマンドは文字列変数を区切り文字 -
で分割します。文字列が分割されると、値が IP
変数に割り当てられます。
次に、for
ループが $IP
変数をループし、echo
コマンドを使用してすべての値を出力します。
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
IP=$(echo $addrs | tr "-" "\n")
for ip in $IP
do
echo "$ip"
done
以下の出力は、$addr
文字列変数が区切り文字 -
で 4つの別々の文字列に分割されていることを示しています。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Bash で IFS
を使用して文字列を分割する
IFS
は InternalFieldSeparator の略です。
IFS
は、拡張後の単語分割、および組み込みの read
コマンドを使用して行を単語に分割するために使用されます。IFS
の値は、単語の境界を認識する方法をシェルに指示します。
IFS
のデフォルト値は、スペース、タブ、および改行です。以下のスクリプトでは、IFS
の元の値が OIFS
変数に格納されており、新しい IFS
値が -
に設定されています。
これは、シェルが -
を新しい単語の境界として扱う必要があることを意味します。シェルは、文字列変数 addrs
を -
で分割し、新しい値を ips
変数に割り当てます。
次に、for
ループが $ips
変数をループし、echo
コマンドを使用してすべての値を出力します。
IFS=$OIFS
は、IFS
変数の元の値を復元するために使用され、unset OIFS
は、追跡する変数のリストから変数 OIFS
を削除するようにシェルに指示します。
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
OIFS=$IFS
IFS='-'
ips=$addrs
for ip in $ips
do
echo "$ip"
done
IFS=$OIFS
unset OIFS
以下の出力は、$addr
文字列変数が区切り文字 -
で 4つの別々の文字列に分割されていることを示しています。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Bash で read
コマンドを使用して文字列を分割する
read
コマンドは、Linux システムに組み込まれているコマンドです。
行の内容を変数に読み込むために使用されます。また、シェル変数に割り当てられている文字列の単語を分割します。
変数 $addrs
文字列は、以下のスクリプトの read
コマンドに渡されます。IFS
は、文字列変数の単語境界として機能する区切り文字を設定します。
これは、-
がこの場合の単語の境界であることを意味します。-a
オプションは read
コマンドに配列に分割された単語を格納するように指示し、-r
オプションは read
コマンドにエスケープ文字をそのまま処理して解釈しないように指示します。
分割された単語は IP
配列に格納されます。for
ループは IP
配列をループし、echo
コマンドを使用してすべての値を出力します。
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
IFS='-' read -ra IP <<< "$addrs"
for ip in "${IP[@]}";
do
echo "$ip"
done
以下の出力から、$addr
文字列変数が区切り文字 -
で別々の 4つの文字列に分割されていることがわかります。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Bash でパラメータ展開を使用して文字列を分割する
以下のスクリプトは、パラメーター展開を使用して文字を検索および置換します。パラメータ拡張に使用される構文は、${variable//search/replace}
です。これにより、変数
の検索
に一致するパターンが検索され、置換
に置き換えられます。
この場合、スクリプトはパターン -
を検索し、それを空白に置き換えます。${addrs//-/ }
を囲む括弧は、ip_array
と呼ばれる新しい文字列の配列を定義するために使用されます。
for
ループを使用して、すべての ip_array
変数要素を反復処理し、echo
コマンドを使用してそれらを表示します。
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_array=(${addrs//-/ })
for ip in "${ip_array[@]}"
do
echo "$ip"
done
以下の出力は、ip_array
のすべての要素を示しています。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
インデックスを渡すことで、ip_array
変数の個々の要素にアクセスできます。以下のスクリプトでは、配列の最初の要素を参照するためにインデックス 0
を渡しました。
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_array=(${addrs//-/ })
printf "${ip_array[0]}\n"
出力には、ip_array
の最初の要素が表示されます。
192.168.8.1
Bash で cut
コマンドを使用して文字列を分割する
以下のスクリプトは、cut
コマンドを使用してサブストリングを抽出します。-d
オプションは、文字列をフィールドに分割するために使用する区切り文字を指定し、-f
オプションは、抽出するフィールドの番号を設定します。
ただし、この場合、文字列は区切り文字として -
を使用して分割され、最初のフィールドにアクセスするには、引数 1
を -f
オプションに渡し、同じようにして 2 番目のフィールドにアクセスします。2
を -f
オプションに渡します。
値は、それぞれ ip_one
変数と ip_two
変数に割り当てられます。printf
コマンドは、変数の値を表示するために使用されます。
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_one=$(echo $addrs | cut -d '-' -f 1)
ip_two=$(echo $addrs | cut -d '-' -f 2)
printf "$ip_one\n$ip_two\n"
以下の出力は、$addrs
文字列変数から分割された最初と 2 番目の文字列を示しています。
192.168.8.1
192.168.8.2