Bash で文字列を分割

Fumbani Banda 2023年1月30日
  1. Bash で文字列を分割するための tr コマンドの使い方
  2. Bash で IFS を使用して文字列を分割する
  3. Bash で read コマンドを使用して文字列を分割する
  4. Bash でパラメータ展開を使用して文字列を分割する
  5. Bash で cut コマンドを使用して文字列を分割する
Bash で文字列を分割

このチュートリアルでは、tr コマンド、IFSread コマンド、パラメーター展開、および cut コマンドを使用して、bash の区切り文字で文字列を分割する方法を示します。

Bash で文字列を分割するための tr コマンドの使い方

tr コマンドは translate の短縮形です。標準入力から文字を変換、削除、および絞り込み、結果を標準出力に書き込みます。

これは、コマンドラインまたは bash スクリプトでテキストを操作するための便利なコマンドです。繰り返される文字を削除したり、小文字を大文字に変換したり、文字を置き換えたりすることができます。

以下の bash スクリプトでは、echo コマンドが文字列変数 $addrstr コマンドにパイプします。このコマンドは文字列変数を区切り文字 - で分割します。文字列が分割されると、値が 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
著者: Fumbani Banda
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub

関連記事 - Bash String