Bashシェルスクリプトで文字列変数を部分的に切り出す(substring)

2022-07-23Bash,Linux

はじめに

Bash シェルスクリプトで 変数 に格納されている文字列を部分的に切り出す方法について。

サンプルコードを掲載しますが、 GNU Bash でのみ動作する機能もありますので、ご注意ください。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

先頭(左)から数文字切り出す

文字列が格納された変数に対して、 先頭(左)から数文字切り出す には、以下のようなコマンドを利用します。

※先頭から 4 文字を切り出してみます

$ STR="Hello World"

$ echo ${STR:0:4}
Hell

Bash の変数は、 ${STR:offset:length} の形式で参照すれば文字列の一部を切り出すことができます。

  • offset : 切り出し開始位置(先頭から切り取りたい場合は 0 を指定)
  • length : 切り出し文字数

また、 0 は省略可能です。

# echo ${STR:0:4} と同じ結果となります
$ echo ${STR::4}
Hell

末尾(右)から数文字切り出す

先程と同じ変数参照の機能を利用します。

※末尾から 4 文字を切り出してみます

$ STR="Hello World"

$ echo ${STR: -4:4}
orld

offset にはマイナスが指定可能です。 -4 としているので、末尾から 4 文字目の切り取りの開始位置としてします。

注意点は -4 の値の前にはスペースを入れないといけない ということです。
スペースがない場合の挙動を確認してみます。

$ STR="Hello World"

$ echo ${STR:-4:4}
Hello World

# まだ定義していない変数に対して実行するとよりわかりやすい
$ echo ${NOTHING:-4:4}
4:4

${STR:-default} の変数参照構文と同じと解釈されてしまうためです。

length の値である 4 は省略可能です。

$ echo ${STR: -4:4} と同じ結果となります
$ echo ${STR: -4}
orld

中央から数文字切り出す

今までの例を見れば、すでにやり方は想像できるはずです。

※4 文字目のすぐ後ろから 4 文字切り出してみます

$ STR="Hello World"

$ echo ${STR:4:4}
o Wo

中央を切り取る

「先頭からの切り出し」、 「末尾からの切り出し」を組み合わせれば、中央部分の数文字のみ切り捨ててしまうこともできます。

4 文字目のすぐ後ろから 4 文字切り捨てた結果を出力してみます。

$ STR="Hello World"

$ echo ${STR:0:4}${STR:8}
Hellrld

おまけ 1 : ${STR:offset:length} で length よりも文字が短かった場合はどうなるの?

切り取ろうとする文字列変数が短すぎた場合、エラーになったりはしないでしょうか。

# 5文字の文字列変数に対して先頭(左)から4文字切り取る
$ STR=12345

$ echo "${STR::4}"
1234

# 3文字の文字列変数に対して先頭(左)から4文字切り取る
$ STR=123

$ echo "${STR::4}"
123

エラー無しで正常動作しますね。

おまけ 2 : sed を使う方法

当ブログで何度も出てきている sed コマンド。何をするにも sed を覚えていると応用が効きます。本当に便利。

sed で先頭(左)から数文字切り出す

※先頭から 4 文字を切り出してみます

$ echo "${STR}" | sed 's/^\(.\{4\}\).*$/\1/'
Hell

# バックスラッシュが多く見にくい場合には -E オプションを使う
$ echo "${STR}" | sed -E 's/^(.{4}).*$/\1/'
Hell

sed で末尾(右)から数文字切り出す

※末尾から 4 文字を切り出してみます

$ echo "${STR}" | sed 's/^.*\(.\{4\}\)$/\1/'
orld

# バックスラッシュが多く見にくい場合には -E オプションを使う
$ echo "${STR}" | sed -E 's/^.*(.{4})$/\1/'
orld

sed で中央から数文字切り出す

※4 文字目から 4 文字切り出してみます。

$ echo "${STR}" | sed 's/^.\{4\}\(.\{4\}\).*$/\1/'
o Wo

# バックスラッシュが多く見にくい場合には -E オプションを使う
$ echo "${STR}" | sed -E 's/^.{4}(.{4}).*$/\1/'
o Wo

ひとこと

ファイルや標準入力を操作する場合には パイプ+sed で操作することがほとんどですので、今回の文字列変数の切り取りは 引数環境変数 を操作する場合に参考ください。

2022-07-23Bash,Linux