読者です 読者をやめる 読者になる 読者になる

sedを使いつつvisual studioを無理やりゴリゴリ回す方法

研究室向けシリーズその4

このシリーズ書くのに疲れていますが最後なので頑張ります。
前回batで処理を自動化したと思うのですが、研究室内のプログラムは割とパラメータが#defineされているケースがあってプログラムの実行時引数に指定するのは面倒だったりします。ちょっとプログラム改変すればいいんですが、それは面倒だなあということも結構あるのではないでしょうか。
ということで今回は

#define N 1

のようにdefineされたパラメータNを1~20まで変化させながらプログラムを順に回すのを目標にします。

流れとしては
sedを使って#define N ◯を見つけて#define N ◯'のように置換→
visual studioのコマンドでビルド→
実行→
ファイル移動→...
終了
とします。

一回一回ビルドして回すのは結構乱暴な感じがしますが、とりあえず問題なさそうな範囲でやりたいと思います。

sedとは

色々機能ありますが、今回使う範囲で言えば置換とか行の削除、追加が出来る便利なやつくらいの認識でOKだと思います。Linuxとかのテキスト処理系としてはawkと併せて抑えておくべき存在です。(多分)

sedのインストール

http://sourceforge.jp/projects/sfnet_gnuwin32/releases/
からsed-4.2.1-setup.exeをダウンロード
C:\Program Files (x86)\GnuWin32\binにパスを通す。
パスとはというかたはawkのときの記事を参照。

sedの使い方

あるファイルのある行を置換したいときは

sed –e “s/(置換前)/(置換後)/” (ファイル名)

のように使います。

例: test.c の fooを10から20に変更

sed –e “s/#define foo 10/#define foo 20/ test.c

注意が一点
"/"は他の命令や区切りと区別できないので"\/"としましょう。(エスケープするといいます)
例: test.c の fooFlagをコメントアウトしてオフにする
sed –e “s/#define fooFlag//*#define fooFlag*// test.c  →できない
sed –e “s/#define fooFlag/\/*#define fooFlag*\// test.c →できる

通常はsedの実行結果は標準出力に出力されますが、

  • iオプションをつけることで元のファイルを上書きすることができます。

例:test.c の fooを10から20に変更され、test.cが上書きされる。

sed -i –e “s/#define foo 10/#define foo 20/ test.c

その他の機能については割愛します。

ループごとに変化する値を変更する。

#define N 5とかを置換前に指定していると#define N 6のときには当然引っかからないので
正規表現を使って#define N 数字みたいな緩いマッチングを行います。
正規表現については割愛するので興味があったら勉強してみてください。
今回は使う分だけ紹介します。

test.c の fooを任意の値から20に変更

sed –e “s/#define foo [0-9]\+/#define foo 20/ test.c

[0-9]+ は 0~9までの文字(=数字)が一回以上繰り返される という意味
(+はエスケープして\+とする。)

[0-9]\+という正規表現を使うことで任意の桁数の数字が指定できます。

CUIVisual studioを使ったビルド

Devenv.exeというVisual studioについてくるプログラムを使えばビルド可能です。
visual studio2010をインストールした状態ではDevenv.exeは
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\にあります。

パスを通してもいいですし、そのまま
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe
と指定しても動きます。(,exeは省略可能)

使い方は
Devenv.exe /build release (.slnファイル名)
です。

結果

ということで今までの知識を総動員すると以下のスクリプトが出来上がります。

for /l %%i in (1, 1, 20) do (
  sed -i -e "s/#define N [0-9]\+/#define N %%i" .\SOURCE\Defconst.h

 “C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Devenv.exe” ^
 .\Test\Test.sln /build release

    .\x64\release\Test.exe input.lst output.lst

    md ..\matome\N=%%i
    xcopy .\Test\answer ..\matome\result_N=%%i /y
)

あとは"Test"の部分などを自分用に適宜変更すれば使えると思います。
各行が何を意味しているか理解しておくと、応用範囲が広がります。

今回はsedやら正規表現やら雑に説明してしまいましたが、(特に正規表現は)割と役に立つ知識なので勉強しておくといいかなーと思います。