Bash の変数/文字列操作 (Parameter Substitution)
Bash では,たとえば f="IMG_0001.JPG"
のとき, ${f%.JPG}
で IMG_0001
が取れる.だいぶ以前にすこし触れたことがあって, そのときには これ とかを参照したが,ここにもメモを残しておく.
用語の整理
echo {01..10}.txt
みたいなのは brace expansion と呼ばれるが,それとはまた違ってですね….
多分 Linux Documentation Project にある Advanced Bash-Scripting Guide では, Chapter 10 Maniplating Variables のなかの Parameter substitution とか string operations とかで扱われている内容で,
Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command.
ともあるので,用語の混乱も致し方なし…という雰囲気.和文献では
- 先程挙げたのでは 変数内の文字列置換 (ozuma.hatenablog.jp) とされていたり,
- 変数展開 (tohoho-web.com) , (qiita.com/t_nakayama0714)とか
- パラメータ展開 (zenn.dev/shmi593) の一機能として扱われたり,
- 変数の置換機能 (gihyo.jp)と呼ばれたり,
しているようだ.
ざっと見る
自分が直近使いそうな気がするやつだけ抜き出す
変数定義されてるかどうかによって変わる系
${parameter-default}, ${parameter:-default} # 未定義なら default
${parameter=default}, ${parameter:=default} # 未定義なら default に set
変数の文字列操作
長さ・index 系
f="IMG_0001.JPG"
echo ${#f} # => 12, 長さ
echo ${f:5} # => 001.JPG, offset 5 から
echo ${f:4:4} # => 0001, offset 4 から最大4文字
# {var:pos:len}
マッチ・置換などの操作系
echo ${f#IMG_} # => 0001.JPG, 前から Pattern を削除
echo ${f##IMG_} # => こっちは最長マッチ,↑は最短マッチ
echo ${f%.JPG} # => IMG_0001, 後ろから Pattern を削除
echo ${f%%.JPG} # => IMG_0001, 同様に最長マッチ
echo ${f/JPG/png} # => IMG_0001.png, 置換
echo ${f/0/Zero} # => IMG_Zero001.JPG
echo ${f//0/Zero} # => IMG_ZeroZeroZero1.JPG, global replacement
echo ${f/%JPG/png} # => IMG_0001.png, 末尾に合致したら置換. # も同様にある
g="out.tiff"
echo ${g/%.JPG/.png} # => out.tiff
echo ${g%.JPG}.png # => out.tiff.png
h="IMG"
echo ${f#$h} # => _0001.JPG, こういうのもできる
ちょっとした処理をその場でするときに便利ですね.
tags: