概要

  • 置換キーワードリストに従って、入力ファイル中のキーワードを置換してファイルへ出力する。
  • キーワード毎に何件置換したかをレポートする。
  • 正規表現による置換も行える。(2007/06/08 更新)
  • SendTo から呼び出せるように変更。(2011/04/16)
  • オプションで、文字セットの指定、辞書の選択、エンターキー待ちするかどうかの選択、レポート出力するかどうかの選択をできるようにしました。(2011/05/08)
  • 置換時にマルチラインオプション(m)を使用するようにしました。(2011/05/08)
  • 複数行にわたる置換ルールを書けるようにしました。(2011/05/08)
  • 入力ファイルが指定されていないときはクリップボードに対して処理するようにしました。(2011/05/17)
  • 1つのルールの中でTabを複数回使えるようにしました。(2011/09/07)
  • 置換対象とするファイルに yml, yaml を加えました。(2011/09/07)

ダウンロード

ソースコード

# replaceKeyword.pl
# by TakeAsh,  2011/09/07
#
# 置換キーワードリストに従って、入力ファイル中のキーワードを置換してファイルへ出力する。
# 入力ファイルを指定しなかった場合は、クリップボードを対象に置換処理を行なう。
# 置換キーワードリストはこのスクリプトと同じディレクトリに保存しておくこと。
#
# 置換キーワードリストは、下記の書式で必要な個数を列記する。
# {置換対象キーワード} \t+ {置換後の文字列} \n
# 行頭に # がある行と空行は無視される。
# 置換後の文字列として「eval(~)」と記述しておくと、Perlの式として評価される。
#
# このスクリプトはUTF-8Nで保存すること

use strict;
use warnings;
use utf8;
use Encode;
use FindBin;
#use FindBin::libs;
use File::Basename;
use Term::ReadKey;
use Tkx;
#use YAML::Syck;

#$YAML::Syck::ImplicitUnicode = 1;

my $charsetConsole	= 'CP932';
my $charsetDefault	= 'utf-8';
my $charsetFile		= $charsetDefault;

binmode( STDIN,  ":encoding($charsetConsole)" );
binmode( STDOUT, ":encoding($charsetConsole)" );
binmode( STDERR, ":encoding($charsetConsole)" );

my $extDic = '.dic';
my $fileNameRepLst = 'replaceKeyword';		# 既定置換キーワードリストファイル名
my $fileNameReport = 'ReplaceReport.txt';	# レポート出力ファイル名
my $fileNameReportFull = '';				# レポート出力ファイルフルパス名(CP932)
my $flgPause = 0;							# 処理終了後エンターキー待ちするかどうか 0:しない 1:する
my $flgReport = 0;							# レポート出力するかどうか 0:しない 1:する

my @extIn = map{ quotemeta( '.' . $_ ); } qw( txt htm html c cpp cs h pl pm js yml yaml );

my %Options = (
	'c' => {
		'desc'	=> "<charset>\tファイルの文字セットを指定します。", 
		'sub'	=> sub{ 
			$charsetFile = shift( @ARGV ); 
			print STDERR ( "CharSet: $charsetFile\n" ); 
		}, 
	},
	'd' => {
		'desc'	=> "<file>\tfile を辞書ファイルとして読み込みます。", 
		'sub'	=> sub{ loadDic( shift( @ARGV ) ); }, 
	},
	'h' => {
		'desc'	=> "\t\tヘルプを表示します。", 
		'sub'	=> \&help, 
	},
	'p' => {
		'desc'	=> "\t\t処理終了後エンターキーの入力を待ちます。", 
		'sub'	=> sub{ $flgPause = 1; }, 
	},
	'v' => {
		'desc'	=> "\t\t$fileNameReport に処理結果を出力します。", 
		'sub'	=> sub{ $flgReport = 1; }, 
	},
);

@ARGV = map{ decode( $charsetConsole, $_ ); } @ARGV;

my @RepPairs =();
loadDic();

my @Files = ();

# オプションはファイルより先に処理
while( my $arg = shift( @ARGV ) ){
	if ( $arg =~ /^-(\w+)/ ){
		my $optsub = $Options{$1}{'sub'};
		if ( ref( $optsub ) eq 'CODE' ){
			&{$optsub};
		} else {
			die( "不正なオプション: $1\n" );
		}
	} else {
		push( @Files, $arg );
	}
}

my $REPO;

# 自動フラッシュ有効化
$| = 1;

if ( @Files <= 0 ){
	# クリップボードに対して処理
	$flgReport = 0;
	my $buffer = doReplace( Tkx::clipboard( 'get' ), \@RepPairs );
	Tkx::clipboard( 'clear' );
	Tkx::clipboard( 'append', $buffer );
} else {
	# ファイルに対して処理
	my( $name, $path, $suffix ) = fileparse( $Files[0], @extIn );
	if ( $flgReport ){
		$fileNameReportFull = encode( $charsetConsole, $path . $fileNameReport );
		open( $REPO, ">:utf8", $fileNameReportFull ) 
			or die( "$path$fileNameReport: $!" );
	}

	# ファイルの処理
	while( my $fileNameIn = shift( @Files ) ){
		print STDERR ( "$fileNameIn\n" );
		my( $name, $path, $suffix ) = fileparse( $fileNameIn, @extIn );
		if ( !$suffix ){
			print STDERR ( "Skipped.\n" );
			next;
		}

		# 出力ファイル名。既存のものは確認なしで上書きされる。
		my $fileNameOut = $path . $name . '_replace' . $suffix;
		report( "InFile:\t%s\nOutFile:\t%s\n#\tN\tOld\tNew\n", $fileNameIn, $fileNameOut );

		# 入力ファイル読み込み
		open( my $IN, "<:encoding($charsetFile)", encode( $charsetConsole, $fileNameIn ) ) 
			or die( "$fileNameIn: $!\n" );
		my $buffer = join( "", <$IN> );
		close( $IN );

		# 置換処理
		$buffer = doReplace( $buffer, \@RepPairs );

		# 置換結果出力
		open( my $OUT, ">:encoding($charsetFile)", encode( $charsetConsole, $fileNameOut ) ) 
			or die( "$fileNameOut: $!\n" );
		print $OUT $buffer;
		close( $OUT );
	}

	if ( $flgReport ){
		close( $REPO );
	}
}

# 自動フラッシュ無効化
$| = 0;

if ( $flgPause ){
	print STDERR ( "Hit Enter.\n" );
	ReadKey(0);
}

exit();

# ヘルプの表示
sub help
{
	die( "使用法: replaceKeyword.pl [<オプション>] [<source> [<source2>...]]\n" . 
		"$fileNameRepLst$extDic に従って文字列を置換します。\n" . 
		"入力ファイルを省略した場合はクリップボードに対して処理が行なわれます。\n" . 
		"オプション:\n" . 
		join( "\n", map{ '-'.$_.' '.$Options{$_}{'desc'} } sort( keys( %Options ) ) ) . "\n"
	);
}

# 置換キーワード取り込み
sub loadDic
{
	my $fDic = ( shift || $fileNameRepLst ) . $extDic;
	open( my $REPLST, "<:utf8", encode( $charsetConsole, $FindBin::RealBin . '/' . $fDic ) ) 
		or die( "$fDic: $!\n" );
	@RepPairs =();
	while( my $line = <$REPLST> ){
		chomp( $line );
		while( $line =~ /^(.*\S)\s+\\$/ ){		# 末尾が \ だったら次の行と結合
			$line = $1;
			<$REPLST> =~ /^(.*)\s*$/;			# 行末の空白を削除する
			$line .= $1;
		}
		if ( ( length( $line ) == 0 ) || ( $line =~ /^#/ ) ){ next };
		$line =~ /^([^\t]+)(?:\t+)?([\s\S]*)$/;	# Old, New を分割 (2回目以降のTabはそのまま残る)
		push( @RepPairs, [ $1, $2 || '' ] );	# New が undef の場合は空白にする
	}
	close( $REPLST );
	if ( $fDic ne $fileNameRepLst . $extDic ){
		print STDERR ( "Dictionary: $fDic\n" );
	}
}

#レポート出力
sub report
{
	if ( $flgReport ){
		printf $REPO ( @_ );
	}
}

# 置換処理
sub doReplace
{
	my( $buf, $refPairs ) = @_;
	my $current = 0;
	foreach my $pair ( @{$refPairs} ){
		my( $old, $new ) = @{ $pair };
		my $n = 0;
		if ( $new =~ /^eval\((.*)\)$/ ){
			no warnings 'uninitialized';
			my $exp = $1;
			$n = ( $buf =~ s/$old/eval($exp)/egm );
		} else {
			$n = ( $buf =~ s/$old/$new/gm );
		}
		report( "%d\t%d\t%s\t%s\n", ++$current, $n, $old, $new );
		printf STDERR ( "%d/%d\r", $current, scalar(@RepPairs) );
	}
	report( "\n" );
	print STDERR ( "\n" );
	return $buf;
}

# EOF

置換例

一括置換

キーワードリスト

# Old	New

# ラム
です。	だ。
。	っちゃ。
私	ウチ

# こども
さ	ちゃ
し	ち
す	ちゅ
せ	ちぇ
そ	ちょ
サ	チャ
シ	チ
ス	チュ
セ	チェ
ソ	チョ

変換結果

入力 出力
この度、私は、内閣総理大臣に任命されました。日本が、厳しい時期を乗り越え、新世紀の発展に向けた出発点に立った今、初の戦後生まれの総理として、国政を預かる重責を与えられたことに、身の引き締まる思いです。多くの国民の期待を正面から真摯に受け止め、身命を賭して、職務に取り組んでまいります。
 国政を遂行するに当たり、私は、まず、自らの政治姿勢を、国民の皆様並びに議員各位に明らかにいたします。私は、特定の団体や個人のための政治を行うつもりは一切ありません。額に汗して勤勉に働き、家族を愛し、自分の暮らす地域や故郷を良くしたいと思い、日本の未来を信じたいと願っている人々、そしてすべての国民の期待に応える政治を行ってまいります。みんなが参加する、新しい時代を切り拓く政治、誰に対しても開かれ、誰もがチャレンジできる社会を目指し、全力投球することを約束いたします。
 我が国は、経済、社会全般にわたる構造改革と、国民の自助努力の相乗効果により、長い停滞のトンネルを抜け出し、デフレからの脱却が視野に入るなど、改革の成果が現われ、未来への明るい展望が開けてきました。
 一方、人口減少が現実のものになるとともに、都市と地方の間における不均衡や、勝ち組、負け組が固定化することへの懸念、厳しい財政事情など、我が国の今後の発展にとって解決すべき重要な課題が、我々の前に立ちはだかっています。家族の価値観、地域の温かさが失われたことによる痛ましい事件や、ルール意識を欠いた企業活動による不祥事が多発しています。さらに、北朝鮮のミサイル発射や、テロの頻発など、国際社会の平和と安全に対する新たな脅威も生じています。
 このような状況にあって、今後のあるべき日本の方向を、勇気をもって、国民に指し示すことこそ、一国のトップリーダーの果たすべき使命であると考えます。私が目指すこの国のかたちは、活力とチャンスと優しさに満ちあふれ、自律の精神を大事にする、世界に開かれた、「美しい国、日本」であります。この「美しい国」の姿を、私は次のように考えます。
 1つ目は、文化、伝統、自然、歴史を大切にする国であります。
 2つ目は、自由な社会を基本とし、規律を知る、凛とした国であります。
 3つ目は、未来へ向かって成長するエネルギーを持ち続ける国であります。
 4つ目は、世界に信頼され、尊敬され、愛される、リーダーシップのある国であります。
 この「美しい国」の実現のため、私は、自由民主党及び公明党による連立政権の安定した基盤に立って、「美しい国創り内閣」を組織しました。世界のグローバル化が進む中で、時代の変化に迅速かつ的確に対応した政策決定を行うため、官邸で総理を支えるスタッフについて、各省からの順送り人事を排し、民間からの人材も含め、総理自らが人選する枠組みを早急に構築するなど、官邸の機能を抜本的に強化し、政治のリーダーシップを確立します。未来は開かれているとの信念の下、たじろぐことなく、改革の炎を燃やし続けてまいります。
この度、ウチは、内閣総理大臣に任命ちゃれまちたっちゃ。日本が、厳ちい時期を乗り越え、新世紀の発展に向けた出発点に立った今、初の戦後生まれの総理とちて、国政を預かる重責を与えられたことに、身の引き締まる思いだっちゃ。多くの国民の期待を正面から真摯に受け止め、身命を賭ちて、職務に取り組んでまいりまちゅっちゃ。
 国政を遂行ちゅるに当たり、ウチは、まず、自らの政治姿勢を、国民の皆様並びに議員各位に明らかにいたちまちゅっちゃ。ウチは、特定の団体や個人のための政治を行うつもりは一切ありまちぇんっちゃ。額に汗ちて勤勉に働き、家族を愛ち、自分の暮らちゅ地域や故郷を良くちたいと思い、日本の未来を信じたいと願っている人々、ちょちてちゅべての国民の期待に応える政治を行ってまいりまちゅっちゃ。みんなが参加ちゅる、新ちい時代を切り拓く政治、誰に対ちても開かれ、誰もがチャレンジできる社会を目指ち、全力投球ちゅることを約束いたちまちゅっちゃ。
 我が国は、経済、社会全般にわたる構造改革と、国民の自助努力の相乗効果により、長い停滞のトンネルを抜け出ち、デフレからの脱却が視野に入るなど、改革の成果が現われ、未来への明るい展望が開けてきまちたっちゃ。
 一方、人口減少が現実のものになるとともに、都市と地方の間における不均衡や、勝ち組、負け組が固定化ちゅることへの懸念、厳ちい財政事情など、我が国の今後の発展にとって解決ちゅべき重要な課題が、我々の前に立ちはだかっていまちゅっちゃ。家族の価値観、地域の温かちゃが失われたことによる痛まちい事件や、ルール意識を欠いた企業活動による不祥事が多発ちていまちゅっちゃ。ちゃらに、北朝鮮のミチャイル発射や、テロの頻発など、国際社会の平和と安全に対ちゅる新たな脅威も生じていまちゅっちゃ。
 このような状況にあって、今後のあるべき日本の方向を、勇気をもって、国民に指ち示ちゅことこちょ、一国のトップリーダーの果たちゅべき使命であると考えまちゅっちゃ。ウチが目指ちゅこの国のかたちは、活力とチャンチュと優ちちゃに満ちあふれ、自律の精神を大事にちゅる、世界に開かれた、「美ちい国、日本」でありまちゅっちゃ。この「美ちい国」の姿を、ウチは次のように考えまちゅっちゃ。
 1つ目は、文化、伝統、自然、歴史を大切にちゅる国でありまちゅっちゃ。
 2つ目は、自由な社会を基本とち、規律を知る、凛とちた国でありまちゅっちゃ。
 3つ目は、未来へ向かって成長ちゅるエネルギーを持ち続ける国でありまちゅっちゃ。
 4つ目は、世界に信頼ちゃれ、尊敬ちゃれ、愛ちゃれる、リーダーチップのある国でありまちゅっちゃ。
 この「美ちい国」の実現のため、ウチは、自由民主党及び公明党による連立政権の安定ちた基盤に立って、「美ちい国創り内閣」を組織ちまちたっちゃ。世界のグローバル化が進む中で、時代の変化に迅速かつ的確に対応ちた政策決定を行うため、官邸で総理を支えるチュタッフについて、各省からの順送り人事を排ち、民間からの人材も含め、総理自らが人選ちゅる枠組みを早急に構築ちゅるなど、官邸の機能を抜本的に強化ち、政治のリーダーチップを確立ちまちゅっちゃ。未来は開かれているとの信念の下、たじろぐことなく、改革の炎を燃やち続けてまいりまちゅっちゃ。

正規表現置換

キーワードリスト

\$Buf\[([^\]]+)\]({[^}]+})	eval('$Ref'.$2.'{\'A'.$1.'\'}')

変換結果

入力 出力
$result = sprintf(
"%s : %d, %d, %d, %d\n" .
"%s : %d, %d, %d, %d\n" .
"%s : %d, %d, %d, %d\n",
$Buf[0]{'x'}, $Buf[0]{'y'}, $Buf[0]{'dx'}, $Buf[0]{'dy'},
$Buf[1]{'x'}, $Buf[1]{'y'}, $Buf[1]{'dx'}, $Buf[1]{'dy'},
$Buf[2]{'x'}, $Buf[2]{'y'}, $Buf[2]{'dx'}, $Buf[2]{'dy'},
);
$result = sprintf(
"%s : %d, %d, %d, %d\n" .
"%s : %d, %d, %d, %d\n" .
"%s : %d, %d, %d, %d\n",
$Ref{'x'}{'A0'}, $Ref{'y'}{'A0'}, $Ref{'dx'}{'A0'}, $Ref{'dy'}{'A0'},
$Ref{'x'}{'A1'}, $Ref{'y'}{'A1'}, $Ref{'dx'}{'A1'}, $Ref{'dy'}{'A1'},
$Ref{'x'}{'A2'}, $Ref{'y'}{'A2'}, $Ref{'dx'}{'A2'}, $Ref{'dy'}{'A2'},
);

HTML/XML をタグ単位で改行

キーワードリスト

# Old	New

# HTML/XML をタグ単位で改行
>			eval(">\n")
\n\s+		eval("\n")
<([\w_-]+)([^>]*)>\n+([^<]*)<\/\1>	eval("<$1$2>$3</$1>")
#>(\s+)<	eval("><")		# 逆変換(改行を削除)

タブ区切りを PukiWiki のテーブルに変換

キーワードリスト

# タブ区切りを PukiWiki 用テーブルに変換

# メタ文字をエスケープ
([|~>:])		eval(sprintf("&#x%02x;",ord($1)))

# "" を削除
(?<=\t)?"([^\t\n]+)"(?=\s)	eval($_=$1; s/""/"/g; $_;)

# 単独の - は中央揃え
(?<=\s)(-)(?=\s)	eval("CENTER:$1")

# 数値は右詰め
(?<=\s)((?:[-+\d.e'"]|&#x3a;)+)(?=\s)	eval("RIGHT:$1")

# OK,NG を中央揃えかつカラーに
\b(OK|NG)\b		eval("CENTER:COLOR(#".{ 'OK'=>'00FF00', 'NG'=>'FF0000' }->{$1}."):$1")

# 末尾が「h/f」の行をヘッダ行/フッタ行と見なして各々の列に「~」を追加 (最大20列まで対応)
^((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?	\
((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?	\
((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?	\
((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?	\
((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?((?:[^\t\n]*)\t)?(h|f)$	\
	eval("~$1~$2~$3~$4~$5~$6~$7~$8~$9~$10~$11~$12~$13~$14~$15~$16~$17~$18~$19~$20$21")
^(.*\t)~+(h|f)$	eval("$1$2")

# ヘッダ行/フッタ行以外の第1列をヘッダに
^([^:]+:)?([^~].*)$			eval("$1~$2")

# colspan
(~[^\t]+\t)((?:~\t)+)	eval(@_=($1,$2); $_=$2; s/~/>/g; "$_$_[0]";)

# rowspan
(?<=\t)(?=\s)	~

\t				|
\A([\s\S]*)\Z	eval("\n$1\n")
\n				eval("|\n|")
\|(h|f)\|\n		eval("|$1\n")
^\|~?\|$		
\A\|\n([\s\S]*[^\n]\n)\n*\|\Z	eval("$1")

変換結果

  • 入力

    "#"	"文字コード"	"改行コード"	"Win"			"Mac"			h
    			"結果"	"サイズ/KB"	"処理時間"	"結果"	"サイズ/KB"	"処理時間"	h
    1	"Shift_JIS"	"CRLF"	"OK"	8.00	"0:00'10"""	"OK"	10.00	"0:00'08"""
    2		"CR"	"NG"	"-"	"-"	"OK"	10.00	"0:00'08"""
    3		"LF"	"OK"	8.00	"0:00'10"""	"NG"	"-"	"-"
    4	"UTF16"	"CRLF"	"OK"	12.00	"0:00'30"""	"OK"	15.00	"0:00'30"""
    5		"CR"	"NG"	"-"	"-"	"OK"	15.00	"0:00'30"""
    6		"LF"	"OK"	12.00	"0:00'30"""	"NG"	"-"	"-"
    "#"	"文字コード"	"改行コード"	"結果"	"サイズ"	"処理時間"	"結果"	"サイズ"	"処理時間"	f
  • 出力 | # | 文字コード | 改行コード | > | > | Win | > | > | Mac | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | | | | 結果 | サイズ/KB | 処理時間 | 結果 | サイズ/KB | 処理時間 | | 1 | Shift_JIS | CRLF | OK | 8.00 | 0:00'10" | OK | 10.00 | 0:00'08" | | 2 | | CR | NG | - | - | OK | 10.00 | 0:00'08" | | 3 | | LF | OK | 8.00 | 0:00'10" | NG | - | - | | 4 | UTF16 | CRLF | OK | 12.00 | 0:00'30" | OK | 15.00 | 0:00'30" | | 5 | | CR | NG | - | - | OK | 15.00 | 0:00'30" | | 6 | | LF | OK | 12.00 | 0:00'30" | NG | - | - | | # | 文字コード | 改行コード | 結果 | サイズ | 処理時間 | 結果 | サイズ | 処理時間 |

Schema から XML に変換

キーワードリスト

# Schema から XML に変換

# フィールド
\s+-\s+[^:]+:\s+[^\n]+\n		\
\s+[^:]+:\s+[^\n]+\n			\
\s+COLUMN_NAME:\s+([^\n]+)\n	\
\s+DATA_TYPE:\s+([^\n]+)\n		\
\s+[^:]+:\s+[^\n]+\n			\
(?=\s*(-\s|\S|\Z))				\
	eval( "\t<FIELD\tName=\"$1\"\tType=\"" . {	\
		'int'				=> 'NUMBER',	\
		'decimal'			=> 'NUMBER',	\
		'money'				=> 'NUMBER',	\
		'bit'				=> 'BOOL',		\
		'date'				=> 'DATE',		\
		'datetime'			=> 'DATE',		\
		'time'				=> 'DATE',		\
		'timestamp'			=> 'DATE',		\
		'char'				=> 'TEXT',		\
		'text'				=> 'TEXT',		\
		'varchar'			=> 'TEXT',		\
		'nchar'				=> 'TEXT',		\
		'ntext'				=> 'TEXT',		\
		'nvarchar'			=> 'TEXT',		\
		'binary'			=> 'TEXT',		\
		'image'				=> 'TEXT',		\
		'varbinary'			=> 'TEXT',		\
		'uniqueidentifier'	=> 'TEXT',		\
	}->{$2} . "\"\t/>\n" )

# テーブル名
^([^-\s][^:]+):		\
	eval("</TABLE>\n<TABLE\tName=\"$1\"\tPrimaryField=\"\">\n")

# 後始末
\A---\s+</TABLE>\s+([\s\S]*)\Z	\
	eval("$1</TABLE>\n")

変換結果

  • 入力
    --- 
    クラスレベルTable: 
      - 
        CHARACTER_MAXIMUM_LENGTH: ~
        COLUMN_DEFAULT: ~
        COLUMN_NAME: ID
        DATA_TYPE: int
        IS_NULLABLE: 'NO'
      - 
        CHARACTER_MAXIMUM_LENGTH: 30
        COLUMN_DEFAULT: ~
        COLUMN_NAME: クラスレベル
        DATA_TYPE: nvarchar
        IS_NULLABLE: 'NO'
    会員Table: 
      - 
        CHARACTER_MAXIMUM_LENGTH: ~
        COLUMN_DEFAULT: ~
        COLUMN_NAME: ID
        DATA_TYPE: int
        IS_NULLABLE: 'NO'
      - 
        CHARACTER_MAXIMUM_LENGTH: 50
        COLUMN_DEFAULT: ~
        COLUMN_NAME: 姓
        DATA_TYPE: nvarchar
        IS_NULLABLE: 'NO'
      - 
        CHARACTER_MAXIMUM_LENGTH: 50
        COLUMN_DEFAULT: ~
        COLUMN_NAME: 名
        DATA_TYPE: nvarchar
        IS_NULLABLE: 'NO'
     …(省略)…
  • 出力
    <TABLE	Name="クラスレベルTable"	PrimaryField="">
    	<FIELD	Name="ID"	Type="NUMBER"	/>
    	<FIELD	Name="クラスレベル"	Type="TEXT"	/>
    </TABLE>
    <TABLE	Name="会員Table"	PrimaryField="">
    	<FIELD	Name="ID"	Type="NUMBER"	/>
    	<FIELD	Name="姓"	Type="TEXT"	/>
    	<FIELD	Name="名"	Type="TEXT"	/>
    	<FIELD	Name="誕生日"	Type="DATE"	/>
    	<FIELD	Name="性別"	Type="NUMBER"	/>
    	<FIELD	Name="Email"	Type="TEXT"	/>
    	<FIELD	Name="電話番号"	Type="TEXT"	/>
    	<FIELD	Name="郵便番号"	Type="TEXT"	/>
    	<FIELD	Name="住所1"	Type="TEXT"	/>
    	<FIELD	Name="住所2"	Type="TEXT"	/>
    	<FIELD	Name="クラスレベル"	Type="NUMBER"	/>
    	<FIELD	Name="前回ログイン"	Type="DATE"	/>
    	<FIELD	Name="備考"	Type="TEXT"	/>
    </TABLE>
    <TABLE	Name="性別Table"	PrimaryField="">
    	<FIELD	Name="ID"	Type="NUMBER"	/>
    	<FIELD	Name="性別"	Type="TEXT"	/>
    </TABLE>

メール返信時の余分な行を削除

キーワードリスト

# Email返信時の余分な行を削除 (クリップボード用)
# 「\r\r\n」があると余分な行になる?

\n>\n(?=>)		eval("\n")
(>\n){2,}		eval(">\n")
\n\n(?!\n)		eval("\n")
\n{3,}			eval("\n\n")
>\x20(?=>)		>
\Z				eval("\n\n")

変換結果

  • 入力
    >
    >
    >
    > Dear John-san, 
    >
    > I want to know ~~
    >
    > Could you let us know ~~
    >
  • 出力
    >
    > Dear John-san, 
    > I want to know ~~
    > Could you let us know ~~
    >

Email アドレスの引用符を統一

キーワードリスト

# Email アドレスの「"'~'"」を「"~"」に統一

"'([^']+)'"		eval("\"$1\"")

参考: Win32::Clipboard の場合

use Win32::Clipboard;

my $clip = Win32::Clipboard();
if ( $clip->IsText() ){
	my $buffer = decode( 'UTF16LE', $clip->GetAs(CF_UNICODETEXT) || '' );
	$buffer = doReplace( $buffer, \@RepPairs );
	$clip->Set( encode( 'CP932', $buffer ) );	# UTF16LE で書き戻せない --;
}

リンク