[Linux] bash で文字列を置換する。 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

文字列を置換する...一般的な言語であれば関数一発でできそうな処理ですが、bash の場合ちょっとした合わせ技が必要なようです。


例えば、フルパスで表現されたファイル名からパスをカットする場合、以下のようなコマンドを実行します。

$ echo "/u01/app/oracle/admin/orcl/alert_orcl.log" | sed 's/.*\///'
alert_orcl.log

  1. echo コマンドで"/u01/app/oracle/admin/orcl/alert_orcl.log"という文字列を標準出力に出力し、
  2. それをパイプを使って sed コマンドの標準入力として受け渡し、
  3. sed コマンドの中で正規表現を使った文字列の置換(ここでは任意の文字列の繰り返しの後に"/"が来る文字列のパターンがあった場合にそれを空文字に置換)を行っています。
この置換結果を変数に代入したいような場合は、上記のコマンドをバッククォート(``)で括って、コマンドの実行結果が変数に代入されるようにします。

filename=`echo "/u01/app/oracle/admin/orcl/alert_orcl.log" | sed 's/\.\///'`

置換対象の文字列がシェルスクリプト実行時に指定した第1引数だったりする場合は、以下のようになります。

filename=`echo "$1" | sed 's/\.\///'`

たかが文字列の置換ごときでかなり回りくどい書き方です。


しかし、このコマンドの中には、echo コマンド、sed コマンド、パイプ、特殊文字(シングルクォート、ダブルクォート、バッククォート、バックスラッシュ)、変数、正規表現と、bash の基本要素がふんだんに盛り込まれています。

この書き方の意味を完全に理解することができれば、bash がかなりわかったような気になれますね^^