テキスト処理にはawk、perl?

久しぶりに(十年ぶりかな)にテキスト処理の必要がありました。
正規表現で抜き出したテキストに最終的に人が判断して置換を行なうというもの。
かつてawkでスクリプトを作ったことを思い出し再利用しようと、win2000環境にawkをインストール。
だが、win対応や2バイト対応などで、どうもうまくいきません。
なら、「一念発起してperlだ」と思ったが、友人いわく「2バイト対応など、状況は大差ないね」とのこと。
皆さんは、何をお使い? やはりperl?それともRuby?
» 001
正規表現の2バイト文字対応でしたら、Unicode環境で行えば問題解決できるかと思います。(win対応というのは、具体的にどういったものか想像できませんでした。)
人判断が入るのでしたら、正規表現の使えるUnicode対応のエディタで行えばいかがでしょうか?
(人判断が入らないのでしたら、スクリプトなりで処理したほうが良いかもしれませんが。もし、php環境があるのでしたら、mb_ereg系のコマンドが使えるかと思います。)
» 002
jperlやjgawkは駄目なの?
» 003
がびさん、ほか?有難うございます。
よく似たスレ(テキストの変換について)も立っていますね。
もう少しこちらの要件を付言すると
1.シフトJIS(2バイト)をあやつること
2.コマンドプロンプト(win2000)で動作すること。
3.「表」などの文字が文字化けしないこと。いわゆるC5問題をクリアしていること。

3.が難しいようですね。
また、jperlの最新版パッチがインスト時にファイル解凍でうまくいかないようです。
uniコードで解決するなら、将来を見据えて1.をやめるのも一考かと思います。
» 004
Windowsだと、サクラエディタやNoEditorなど、正規表現の扱える優秀なフリーのエディタはたくさんあるので、まずは試してみては如何でしょう?(有償のも当然あります。)
エディタ内部で処理をUnicodeで行っている可能性もあります。試しにNoEditorでデフォルトS-JISで試しましたが、正規表現で2バイト文字が正常に引っかかってくれました。
(仮にそうでない場合、入り口と出口がS-JISならば良い訳で、もしS-JIS環境時に2バイトの正規表現が駄目ならば、編集時にUnicodeに変換して作業を行えばいいだけだと思います。但し変換時に変換出来なかった字が無いか、特殊文字を使っている時は気をつける必要がありますが。)
2.の必然性は良く分かりません。別に2.は満たしていなくても目的は達せられると思っています。(単にWindows2000で動くという意味なら分かりますが、コマンドプロンプトで動作しなければいけないというのが...)
3.はエディタを使う事により、エディタ側で解決してくれるのではないでしょうか?
今回は、「最終的に人が判断して置換を行なう」という要素があるので、やはりエディタの使用がオススメだと思います。
» 005
>jperlの最新版パッチがインスト時にファイル解凍でうまくいかないようです。

インストールされているPerlのバージョンは?
「5.005_03」でなければ駄目ですよ。
» 006
003 大福餅さん:

ActivePerl 5.8 を入れて、適切なコードを書くと、

>1.シフトJIS(2バイト)をあやつること
>2.コマンドプロンプト(win2000)で動作すること。
>3.「表」などの文字が文字化けしないこと。いわゆる
> C5問題をクリアしていること。

がクリアできます。ちなみに3.は 0x5C 問題だと思います。

テストコード

#!/usr/bin/perl
use encoding "cp932";
use open IN => ":raw:eol(LF)";
use open OUT => ":crlf",":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
$_ = 'C:\test\管理表1.eps';
s|^.+\\||g;
print "$_\n";
__END__

これで、ActivePerl 5.8.8/Windows XP のコマンドプ
ロンプトにおいてテスト済み。Windows 2000 でもおそ
らく大丈夫かと思います。

ShiftJIS の作業はあまりやってないもので、もし問題
があったら指摘をお願いします。
» 007
その後、改行コードが CR+LF になるような設定をず
うっと詰めていまして、先ほどのサンプルスクリプ
トの先頭を以下のように置き換えると、だいたいの
場面において、CR+LF の改行が得られるようになり
ました。

#!/usr/bin/perl
use encoding "cp932"; # このスクリプトはCP932で書くよ
use open IO=> ":encoding(cp932)"; # PerlIO経由時はCP932
binmode STDIN => ":crlf:encoding(cp932)"; # 標準入力はCP932、:crlf無→pipe×
binmode STDOUT => ":crlf:encoding(cp932)"; # 標準出力はCP932、:crlf無→pipe×
binmode STDERR => ":encoding(cp932)"; # 標準エラー出力はCP932

ドキュメント読んでもよく分からなかったりして、
試行錯誤してしまいました。まずいところがあっ
たら、指摘をいただければ有り難いです。
» 008
ruby 使ってます(win2k/xp)。ファイルの最初に

#! ruby -Ks
require 'jcode'
$KCODE = 's'

と、ShiftJIS用の指定を書いて、あとはあんまりコードを意識しないでやってます。
スクリプトをexerbで実行ファイル化すれば、他のPCで作業したいときも
その実行ファイルを持っていくだけで使えるのも便利です。

PerlやPythonだと
入力→Unicodeに変換→処理→ShiftJISに変換→出力
のようになると思うんですが、半角カナとか外字コードとかちゃんと扱えるんですかね?
» 009
追記
・「(スクリプト中の記述・処理では)あんまりコードを意識しないで」
 という意味でした。入力ファイルのコードはShiftJISを前提にしてます。

・Perlでの、CLさんが書かれているような やり方は知りませんでした。
» 010
少し検証しましたので
perl 5003では「表」はダメでした。
5005では無事クリアしました。
awkでverと2バイトが少し複雑なようですね。
検証中ですが何故か purse error や no files が頻発します。
エディターの利用がスマートなやり方だと思うのですが、私が利用している有料かつ名の通った某エディターは、正規表現検索可能を歌っていますが、まったく機能不全でだめでした。
お勧めのエディターも試して見ます。

このページをシェア