2009年08月18日

Linuxで大文字小文字を変換する。(trと、sedのGNU拡張)

えみゅはにで、NP2 for PSPのソースをUbuntu 9.04上に構築したpsptoolchainでmakeしようとしてはまった。

原因はLinuxがファイル名の大文字と小文字を区別すること。
NP2 for PSPのソースは、はWindowsやMac OS X(Mac OS Xはファイルシステムによってはファイル名の大文字と小文字を区別する)等、ファイル名の大文字と小文字を区別しないOS上で作成されているようで、ここら辺が結構ルーズなようだ。

ファイル名が実際には大文字であるにもかかわらず、makefile中やソースファイル中では、小文字でそのファイル名を記述したりしている。

解決案としては、ファイル名を大文字から小文字に変換するか、makefile中のファイル名記述を小文字から大文字に変換するか、のどちらかが考えられる。

では、ファイル名を大文字から小文字に変換するにはどうすればよいか。
いろいろ技があるとは思うが、以下のように行った。

hissorii@ubuntu-vb:~/tmp/np2psp$ for f in * ; do mv $f `echo $f | tr A-Z a-z`; done

ただこれだと、カレントディレクトリしか変換されない。ではどうするか。こうする。

hissorii@ubuntu-vb:~/tmp/np2psp$ for f in */* ; do mv $f `echo $f | tr A-Z a-z`; done

うわ、しょぼっ。効率がよいのか悪いのか微妙だが、変換できればいいんです。
最終的には、以下まで実行して全て変換できました。

hissorii@ubuntu-vb:~/tmp/np2psp$ for f in */*/*/*/*/* ; do mv $f `echo $f | tr A-Z a-z`; done
mv: stat `*/*/*/*/*/*'を実行できません: No such file or directory
hissorii@ubuntu-vb:~/tmp/np2psp$

もし、*.H, *.Cといったプログラムファイルのみ変換したいような場合は、以下のようにすればよい。

hissorii@ubuntu-vb:~/tmp/np2psp$ for f in *.[HC] ; do mv $f `echo $f | tr A-Z a-z`; done


次に、sedを使ったファイル中の大文字小文字変換について。
たとえば、プログラムの行頭が以下の様になっていたとします。

hissorii@ubuntu-vb:~/tmp/np2psp/psp$ head np2.c
#include "compiler.h"
// #include
// #include
// #include
#include "strres.h"
#include "np2.h"
#include "dosio.h"
#include "commng.h"
#include "fontmng.h"
#include "inputmng.h"
hissorii@ubuntu-vb:~/tmp/np2psp/psp$

これが何行も続き、しかも複数のファイルで変換を行わなければならなかった場合、手動で変換するのは相当きつそうです。
そこでsedの登場です。ただしGNUの拡張が施されたsedである必要があります。
私の使っているUbuntu 0.94では、以下の様にGNU sedですので大丈夫です。

hissorii@ubuntu-vb:~/tmp/np2psp$ sed --version
GNU sed 4.1.5版
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

訳注: 非常に重要な文章のため、原文を残しています。
-- 参考訳
これはフリー・ソフトウェアです。複製の条件に関しては、ソースをご覧くださ
い。保証は一切ありません。営利目的や法で定められた範囲での特定目的のため
の適合性もありません。
hissorii@ubuntu-vb:~/tmp/np2psp$

では、実際に先ほどのファイル中の小文字でファイル名指定しているところを大文字に変換してみましょう。

hissorii@ubuntu-vb:~/tmp/np2psp/psp$ sed 's/\(^#include[[:blank:]][\"\<]\)\(.*\)\([\"\>]\)/\1\U\2\E\3/' np2.c | head
#include "COMPILER.H"
// #include
// #include
// #include
#include "STRRES.H"
#include "NP2.H"
#include "DOSIO.H"
#include "COMMNG.H"
#include "FONTMNG.H"
#include "INPUTMNG.H"
hissorii@ubuntu-vb:~/tmp/np2psp/psp$

はい、変換できました。
今回はGNU拡張の\U\2\Eの部分がミソで、\Uで大文字変換開始、\Eで大文字変換終了、というところを説明したかったのですが、sed使い慣れていないと、その他の部分も結構難しい気がするが、まあいいか。
いずれsedの基本的な解説も行うことにしましょう。


posted by ひっそりぃ at 15:38| Comment(0) | TrackBack(0) | linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。