シェルスクリプト内で変数の値を置換する方法

シェルスクリプトを作成していると、変数の値を置換して出力したいと思うときがあるだろう。
では、どのような方法があるのだろうか?

1.sedコマンドを用いる

どの環境でも利用できる事を考えると、bashやkshに依存しない「/bin/sh」で利用出来る方法となる。
「/bin/sh」で利用出来る方法となると、sedコマンドを用いた方法が一般的だろう。

以下の例では、変数「TEST」の中身を「test1234」から「test5678」に置換している。

#!/bin/sh

TEST="test1234
test1234"

TEST=`echo "$TEST" | sed s/1234/5678/g`
echo "$TEST"

改行も出力され、問題なく置換ができている。
sedコマンドの動作については、こちらを参照してもらいたい。

2.変数の展開時に置換を行う(bash/ksh等)

※ この方法は「/bin/sh」では利用出来ないので注意。

bashやkshを使える環境であれば、変数の展開時に置換を行う事もできる。
例えば、変数「TEST」に入っている値「abcdef abcdef 1234 1234」の内容で、「abc」を「XYZ」に置換するとしよう。

この場合は、以下のように変数を展開すれば良い。

echo ${変数名/置換前文字列/置換後文字列}

上記内容でコマンドを実行する。

$ TEST="abcdef abcdef 1234 1234"
$
$ echo $TEST
abcdef abcdef 1234 1234
$
$ echo ${TEST/abc/XYZ}
XYZdef abcdef 1234 1234
$ 

なお、上記の例だと最初にマッチした値しか置換しない。
マッチした文字列を全て置換する場合は、以下のようにする。

echo ${変数名//置換前文字列/置換後文字列}

上記例で実行した結果がこちら。

$ TEST="abcdef abcdef 1234 1234"
$
$ echo $TEST
abcdef abcdef 1234 1234
$
$ echo ${TEST//abc/XYZ}
XYZdef XYZdef 1234 1234
$

bashやkshであれば、このような形での置換も可能だ。