Bashシェルスクリプトで文字列変数を部分的に切り出す(substring)
はじめに
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
末尾(左)から数文字切り出す
先程と同じ変数参照の機能を利用します。
$ 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:3:4}
lo W
その他 : sed
で切り取る
当ブログで何度も出てきている sed
コマンド。何をするにも sed
を覚えていると応用が効きます。本当に便利。
先頭(右)から数文字切り出す
$ echo "${STR}" | sed 's/^\(.\{4\}\).*$/\1/'
Hell
末尾(左)から数文字切り出す
$ echo "${STR}" | sed 's/^.*\(.\{4\}\)$/\1/'
orld
その他 : ${STR:offset:length}
でlengthよりも文字が短かった場合はどうなるの?
切り取ろうとする文字列変数が短すぎた場合、エラーになったりはしないでしょうか?
# 5文字の文字列変数に対して先頭(右)から4文字切り取る
$ STR=12345
$ echo "${STR::4}"
1234
# 3文字の文字列変数に対して先頭(右)から4文字切り取る
$ STR=123
$ echo "${STR::4}"
123
エラー無しで正常動作しますね。
ひとこと
ファイルや標準入力を操作する場合には パイプ+sed で操作することがほとんどですので、
今回の文字列変数の切り取りは 引数 や 環境変数 を操作するケースかと思います。
ディスカッション
コメント一覧
まだ、コメントがありません