2015年1月8日木曜日

shとbashで文字列置換

シェルスクリプトで文字列を置換したい際、sed, per -pe などを使う手法が紹介されることが多い。が、実はこれらの外部コマンドを使わなくても、以下のように変数展開をすることでシェル内部で文字列置換をすることができちゃいます。

$ {変数名#パターン} → 前方一致でのマッチ部分削除(最短マッチ)
$ {変数名##パターン} → 前方一致でのマッチ部分削除(最長マッチ)
$ {変数名%パターン} → 後方一致でのマッチ部分削除(最短マッチ)
$ {変数名%%パターン} → 後方一致でのマッチ部分削除(最長マッチ)
$ {変数名/置換前文字列/置換後文字列} → 文字列置換(最初にマッチしたもののみ)
$ {変数名//置換前文字列/置換後文字列} → 文字列置換(マッチしたものすべて)
#!/bin/bash

echo "実行スクリプト ファイルパス : " ${0%/*}
echo "実行スクリプト ファイル名   : " ${0##*/}
echo

PATH=home/to/path/file.ext
echo 'PATH='${PATH}
echo
echo '${PATH#*/} : '${PATH#*/} 
echo '${PATH##*/}: '${PATH##*/}
echo '${PATH%/*} : '${PATH%/*} 
echo '${PATH%%/*}: '${PATH%%/*}
echo '${PATH%.*} : '${PATH%.*} 

実行結果

$ /bin/sh /tmp/test/tt.sh
実行スクリプト ファイルパス :  /tmp/test
実行スクリプト ファイル名   :  tt.sh

PATH=home/to/path/file.ext

$ {PATH#*/} : to/path/file.ext
$ {PATH##*/}: file.ext
$ {PATH%/*} : home/to/path
$ {PATH%%/*}: home
$ {PATH%.*} : home/to/path/file