ろば電子が詰まつてゐるスマートフォン用の表示で見るろば電子が詰まつてゐる2013-09-28shとbashでの変数内の文字列置換などシェルスクリプトシェルスクリプトで文字列を置換したい際、sedを使う手法が紹介されることが多い。実はsedなどの外部コマンドを使わなくても、以下のように変数展開をすることでシェル内部で文字列置換をすることができる。文字列置換(マッチしたものすべて)この機能は記号で書かれるため非常にググりにくいことと、素のshでできること・bashでしかできないことが混在して書かれた記述も多いため、あまりネット上にこれという情報が無いようだ。いうわけで、一度ここで整理してみることにする。前方一致でのマッチ部分削除これは素の/bin/shでも使える書き方。#以降に記述したパターンを用いて変数内の文字列を前方一致でマッチし、マッチした部分を削除した文字列を返す。して文章で書いても意味分からんと思うので、以下の例を見た方が早いだろう。${var##*/}こういうシェルスクリプトを書いて実行すると、結果は以下のようになる。先ほど書いた通りこれはbashでなくてshの機能なので、FreeBSDの/bin/shでも動くことを確認している(もちろんbashでも動くけど)。これはファイルのフルパスを与えた際に、ファイル名だけを取り出すのによく使われる手法である。「任意の文字列の最後がスラッシュで終わるもの」を最長マッチ(##と、シャープを2コ)して削除すれば、ファイル名だけが残るという仕組みだ。最短マッチでは一番最初のスラッシュだけ除かれてしまうので、このタイプでの実用性は無いだろう。参考に書いておいただけである。お気づきだろうが、この用途ならば現代のLinuxならばbasenameコマンドを使えば同じようなことはできる。後方一致でのマッチ部分削除シャープ(#)をパーセント(%)に置き換えると、マッチを後方一致でおこなうことができる。シャープ(#)と同様、パーセント(%)を二つ並べて%%にすると最長マッチ(欲張りマッチ)する。これも文章で書くとよく分からんだろうから、さっさと例を出そう。${var%%.*}これを実行すると以下のようになる。./var.sh/my/path/dir/test.20130930/my/path/dir/testこの手法は、ファイル名から任意の拡張子を除くために使われることがある。CentOSなら、/etc/init.d/netwowk内にこの書き方を見ることができる(ので、お手元のLinuxを参照してみるといいだろう)。拡張子を除く例では、ドットが複数あることを想定して、最短マッチする%で書くことが多い。この例も、現代のLinuxならばdirnameコマンドを使えば同じ結果を得ることができる。外部コマンドを使いたくないシステム寄りのシェルスクリプトは、今もこの手法で書かれることが多いので、知識として知っておいた方がいいだろう。置換するこの記法はbashでしか使えないので、FreeBSDの/bin/shではエラーになる。sedと同じ感じで、先に置換したいパターンを書き、スラッシュの後に置換後文字列を書くことで置換できる。以下のような例になるだろう。${var//abc/XXX}これを実行すると以下のようになる。xyz置換する際、変数直後のスラッシュを一つだけにすると最初に一致したものしか置換しない。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。