http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=macro&tree=c200 を流用して作ってみました。
(URL にちょっとだけ説明があります)
=head1 NAME
MultiReplace.pls - 複数のパターンに基づく置換処理
=head1 DESCRIPTION
パターンファイル(MultiReplace.txt)の記述に基づいて、選択部分の置換処理を行う。
パターンファイルの各行には「B<pattern>\tB<replacement>」を記述してください。
(例)
& &
< <
> >
※POD なので先頭に TAB 入れてますが、実際は記述不要です。
置換は先頭から順に処理されます。
未選択状態の場合、パターンファイルを開きます。
=cut
use strict;
use warnings;
use encoding 'cp932';
binmode(STDERR, ':raw :encoding(cp932)');
use Encode;
use Win32::OLE qw/CP_UTF8/;
Win32::OLE->Option(CP => CP_UTF8); # OLE のインターフェイスを UTF8 に
# パターンファイルの名称取得
my $macfile = ExpandParameter('$M'); # マクロファイル名
(my $patfile = $macfile) =~ s/[^.]+$/txt/; # パターンファイル名は拡張子を .txt にしたもの
# 選択部分の取得
unless (IsTextSelected()) {
# 未選択時はパターンファイルを開いて終了
FileOpen($patfile);
exit(0);
}
my $seltext = GetSelectedString(0);
# パターンファイルの読み込み
$patfile = encode('cp932', $patfile); # ファイル名は cp932
open PAT, "<:encoding(cp932)", $patfile or die "can't open $patfile: $!";
my @lines = <PAT>;
close PAT;
# 置換箇所のカウント
my $count = 0;
foreach my $line (@lines) {
# 改行の除去
$line =~ s/\r?\n//;
my ($pattern, $replacement) = split(/\t/, $line, 2);
# 置換処理の実行
eval { $count += ($seltext =~ s/$pattern/$replacement/g); };
# エラー時
if ($@) {
MsgBox($@); # エラー表示
FileOpen($patfile); # パターンファイルを開く
exit(1);
}
}
# 置換結果の出力
InsText($seltext);
# 件数の出力
$count = 0 if $count eq '';
MsgBox(encode('cp932', "$count 箇所を置換しました。"));
#...............................................................................
#...............................................................................
#...............................................................................
#...............................................................................