Perl な日々
【ログファイルの邪魔な^Mを一括消去】
プログラムのソースコードと実行結果をレポートに掲載するため、script コマンドを使ってシェル上での会話のログを取る人が多いと思います。
$ script tekitou.log
※ 『$』 は入力しないでね。 以下同様。
ところが、emacs などのエディタでログファイルを開いてみると、
script コマンドが 2009年01月09日 (金) 14時43分16秒 で起動されました。^M
sv02_129: nl OSA.c^M^M
1 // OSA.c^M
2 // ---------------------------------------------^M
3 // コマンドラインで指定したディレクトリ内の各々^M
4 // のファイルの型、パーミッションモード、所有者、^M
5 // サイズ、作成年月日(最終更新時刻)、ファイル名、^M
6 // のリストを表示するプログラム。^M
7 // ^M
8 // 但し、所有者としてはid番号を表示するのではな^M
9 // く、ユーザ名を表示するようにしている。^M
10 // ---------------------------------------------^M
11 // t06i283g 工藤貴之^M
^M
12 #include <stdio.h>^M
13 #include <stdlib.h>^M
14 #include <dirent.h>^M
15 #include <unistd.h>^M
16 #include <pwd.h>^M
17 #include <sys/stat.h>^M
18 #include <sys/types.h>^M
<<以下省略>>
みたいな感じで、余計な 『^M』 が混入してしまっています。
これをいちいち replace-string などで消すのは煩わしいので、作業効率化のための Perl スクリプトを作りました。 というより、サンプルをちょっといじっただけなのですが (笑)。
use strict;
use warnings;
# カレントディレクトリ内にある全てのログファイルの
# 「^M」 を一括消去するスクリプト。
#
# 参考:『新版Perl言語プログラミングレッスン入門編』
# 結城 浩 著
my $dirname = ".";
opendir(DIR, $dirname) or die "$dirname: $!";
while (my $dir = readdir(DIR)) {
next unless (-f $dir);
next unless ($dir =~ /\.log$/);
print $dir, "\n";
open(FILE, $dir) or die "$dir: $!";
my @file = <FILE>;
close(FILE);
foreach my $line (@file) {
$line =~ s/\r+\n/\n/g;
}
open(NEWFILE, "> $dir") or die "$dir: $!";
print NEWFILE @file;
close(NEWFILE);
}
closedir(DIR);
これをコピペして、適当な名前 (例: hoge.pl) で保存します。
場所は、ログファイルと同じディレクトリにして下さい。
そして、ログファイルを作り終えたら、
$ perl hoge.pl
と入力すると、そのディレクトリ内にある全てのログファイルから 『^M』 が削除されます。
script コマンドが 2009年01月09日 (金) 14時43分16秒 で起動されました。
sv02_129: nl OSA.c
1 // OSA.c
2 // ---------------------------------------------
3 // コマンドラインで指定したディレクトリ内の各々
4 // のファイルの型、パーミッションモード、所有者、
5 // サイズ、作成年月日(最終更新時刻)、ファイル名、
6 // のリストを表示するプログラム。
7 //
8 // 但し、所有者としてはid番号を表示するのではな
9 // く、ユーザ名を表示するようにしている。
10 // ---------------------------------------------
11 // t06i283g 工藤貴之
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <dirent.h>
15 #include <unistd.h>
16 #include <pwd.h>
17 #include <sys/stat.h>
18 #include <sys/types.h>
<<以下省略>>
何度も言いますが、このスクリプトは複数のファイルに対して一括して処理できるため、最初に必要なログファイルを全部揃えてから、一回
$ perl hoge.pl
と入力するだけで OK。 もちろん、それ以外の箇所に手を加えたりはしないので、『2回実行したら正常な改行コードまで削除された』 などという事態は起こりません。
もし興味がありましたらお試しください。
| 固定リンク


コメント