« メタポスト・プレビュー用のシェルスクリプト | メイン | プラスティックが可燃ゴミになってた »

2007年10月07日(日曜日)

パイプライン処理とsedで解決 [ UNIX ]

いろいろ調べた結果、複数のコマンドをパイプで繋げば出来そう。もしかしたら、bashに正規表現の置換が組み込まれているかもだが。もっとも、シンプルなプログラムを組み合わせて複雑な作業をさせるってのが、UNIXの元々の思想だから、以下の方法は案外と正統派かもしれない。

echo で変数を標準出力に出して、これをパイプで sed (stream editor) に繋ぐ。sed は正規表現(多分)が使える。 sed s/文字列1/文字列2/ とすれば文字列1の部分をサーチして文字列2に置換する。今回の場合、サーチの対象はファイルではなくパイプラインでやってきた標準入力。文字列1は拡張子を除いた部分にマッチするようにして、文字列2は空にする。こうすると、拡張子以外が空の文字列に置換され、結果は拡張子のみとなる。拡張子以外にマッチさせるには、正規表現を用いて、 ^.*\. とする。「^」は行頭にマッチ、「.」は任意の1文字にマッチ、「*」は0個以上の任意の文字列にマッチ、「\.」はドット(ピリオド)にマッチする。sed では最長マッチが採用されているらしいので、これで途中にドットがあるファイル名についても最後のドットまでがマッチすることになる。これを空文字に置換すれば、拡張子のみが抽出される。結局、
echo ファイル名 | sed -e 's/^.*\.//'
とすれば、ファイル名から拡張子の部分を取り出すことができる。この文をバッククォートで囲めば、コマンドとして実行され、その結果(拡張子)が帰ってくるので、それを mp と比較すればよい。

ということで、拡張子チェックの部分を
if [ `echo $infile | sed -e 's/^.*\.//'` != 'mp' ]
に取り替えた。

投稿者 sukarabe : 2007年10月07日 15:11

トラックバック

このエントリーのトラックバックURL:
http://njet.oops.jp/cgi/mt/mt-tb-alt.cgi/1643

コメント

コメントしてください

comment spam対策のため,名前とメールの入力が必須になっていますが,メールアドレスは公開されません。Web SiteのURLは任意です。Type Key IDをお持ちの方はType Keyをサイン・インしてくださってもいいです。





次回の入力を省くために、名前・URLなどを保存しますか?