shell script 文字列処理
- はじめに
- 文字列置換
- 複数ファイルへの連続文字列置換・挿入例
-
- 参考文献・参考ウェブページ
- 履歴
このページはシェルスクリプトの文字列処理についてのTIPS を記載しています。
シェルスクリプトにはパターンマッチで変数の文字列を変更する機能があるが、これを使用するよりもsed やperl を用いたほうが強力な変換機能を用いることが可能。
$ echo $filename
toby.tar.gz
$ filename=`echo $filename | sed s/\.tar\.gz$/.tgz/`
$ echo $filename
toby.tgz
参考:
中央大学シェルスクリプト説明ウェブページ[シェルの置換機能]
bashで始めるシェルスクリプト基礎の基礎[パターンマッチ]
複数ファイル中の文字列のパターンを変更する例。
多数のファイルの修正を一括でするときに重宝するやり方。
今回[目次] というメニューへのアンカーへのリンクを[contents] という文字列に変更したかった。
そのために、以下のスクリプトを実行して対処した。
改善点として、標準出力への表示、大文字・小文字の区別の有無、などが考えられる。
また、スクリプトでは入力対象を$* としている。これは各種のコマンドをファイルにして実行していたため、入力のファイル名称を用いる手法。
標準的なcygwin で変換を行っているためにコマンドラインでの日本語の文字列の入力ができなかった。
その回避のためにファイル形式にした。
- 「変更1」まずは目次そのものの変更をループのsed でかける。
このとき、"" がエスケープシーケンスであることに注意。
出力は中間ファイルに出力し、失敗に備える。
for i in $*; do sed "s/<a name=\"contents\">/<a name=\"table_of_contents\">/g" $i > ${i%.html}.mod1 ; done
- 「変更2」その後リンク文字列の変更をループのsed でかける。
このとき、[]/ がエスケープシーケンスであることに注意。
for i in $*; do sed "s/<div align=\"right\"><small><a href=\"#contents\">\[目次\]<\/a><\/small><\/div>/<div align=\"right\"><small><a href=\"#table_of_contents\">\[content\]<\/a><\/small><\/div>/g" $i > ${i%.mod1}.mod2 ; done
- ついでに行末にvim タグを挿入する。このときは本文をcat したのちに、echo した文字列をファイル末にリダイレクトで追加している。
for i in $*; do cat $i > ${i%.mod2}.mod3; echo "<!-- vim:set ts=2 sts=0 sw=2 tw=0: -->" >> ${i%.mod2}.mod3 ; done
- 最後にファイル名称を目的の物に直す。
出力のまえにオリジナルファイルのバックアップを取るべき。
for i in $*; do cp -f $i ${i%mod3}html; done
- 2006/11/08 追記
- 2006/09/05 新規作成・分岐版
|