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
