ども、初老丸です。

tl;dl

シェルスクリプトで変数内の文字列を置換したり、変数に代入したファイルパスからファイル名だけを取り出したいと考える際に真っ先に sed でゴニョゴニョを思いつくが、Bash だと Bash 内で完結出来ることを以下の記事でしったので実際に試してみた。

シェルスクリプトで文字列を置換したい際、sedを使う手法が紹介されることが多い。が、実はsedなどの外部コ..

d.hatena.ne.jp

Bash Reference Manual: Shell Parameter Expansion

www.gnu.org

有難うございました。

ショートメモ

サンプルスクリプト

$ cat test.sh
#
# - . を _ に置換する
#
echo "### . を _ に置換する"
TEXT="www.hoge.com"
echo ${TEXT}      # www.hoge.com
echo ${TEXT/./_}  # www_hoge.com
echo ${TEXT//./_} # www_hoge_com

echo ""
#
# - ファイルパスから / を削除する
#
echo "### ファイルパスから / を削除する"
FILE="/path/to/test.txt"
echo ${FILE}      # /path/to/test.txt
echo ${FILE#*/}   # path/to/test.txt
echo ${FILE##*/}  # test.txt

置換

実際にサンプルを実行すると以下のような結果となる。

$ bash test.sh
### . を _ に置換する
www.hoge.com
www_hoge.com
www_hoge_com

ということで、文字列置換は以下の通り。

echo ${TEXT}      # www.hoge.com
echo ${TEXT/./_}  # 最初にマッチした対象を置換
echo ${TEXT//./_} # すべてにマッチした対象を置換する

削除

実際にサンプルを実行すると以下のような結果となる。

$ bash test.sh
### ファイルパスから / を削除する
/path/to/test.txt
path/to/test.txt
test.txt

ということで、文字列削除は以下の通り。

echo ${FILE}      # /path/to/test.txt
echo ${FILE#*/}   # 最初にマッチした対象(*/)を削除
echo ${FILE##*/}  # すべてにマッチした対象(*/)を削除

以上

これは便利、ちゃんと覚えておくべ。

元記事はこちら

Bash で変数内の文字列を置換するショートメモ