テキストの行が特定の文字の場合に置換する

テキスト文章で、ある行が特定の文字列だった場合に、別の文字に置き換える処理を行ってみたいと思います


たとえば、テキスト文章からHTMLファイルを作成する時に、複雑なテーブルを多用すると頭が混乱してきてイライラしてきますよね(私だけか?)
複雑なHTMLを特定のキーワードに置き換えておいて、perl で一度に置き換える方法について考えてみたいと思います



まず初めに実験となるテキストファイルを作成します

$ cat a.txt
aaa
bbb
ccc
ddd
<start>
eee
fff
ggg
<end>
hhh
iii

このテキストファイルの<start>と<end>の行を特定の文字列の行に置換してみたいと思います

test.pl という名前で以下のプログラムを保存しました

$map{"<start>"}="+++++++\nstartです\n+++++++\n";
$map{"<end>"}="-------\nendです\n-------\n";

while($line=<>){
        $line =~ s/\r//;                #改行を削除する
        $line =~ s/\n//;                #改行を削除する
        if($map{$line}){
                print $map{$line};
        }else{
                print "$line\n";
        }
}


上記プログラムを実行

$ cat a.txt | perl test.pl
aaa
bbb
ccc
ddd
+++++++
startです
+++++++
eee
fff
ggg
-------
endです
-------
hhh
iii


<start>と<end>が別の文字列の行に置き換えられているのが確認できます




■HTMLファイルを作成する


HTMLファイルとして作成したいイメージ
テーブルを3つヨコに並べて真ん中のテーブルを大きくしてに文字を表示する。
その中に任意のテーブル数を立て向きに配置して文章を表示する。

+--------------------+
|  |     TITLE    |  |
|  | +----------+ |  |
|  | |aaa       | |  |
|  | |bbb       | |  |
|  | +----------+ |  |
|  | +----------+ |  |
|  | |ccc       | |  |
|  | |ddd       | |  |
|  | +----------+ |  |
+--------------------+



▼作成したいイメージのHTMLに必要と思われるキーワードを抜き出し、
上記で作成したプログラムのマップ部分に追加しました
ファイルの行のキーワード ( <START> ) などを目的の文字列 ( <html> ) などに変換します


$map{"<MAIN TEXT START>"}="<!-- MAIN TEXT START -->\n<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n<td width=\"10%\" valign=\"top\"></td>\n<td width=\"80%\" valign=\"top\">\n<br>\n";
$map{"<TEXT START>"}="<table width=\"100%\" bgcolor=\"#FFFFFF\">\n<td BGCOLOR=\"#FFFFFF\" >\n";
$map{"<TEXT END>"}="</td>\n</table>\n";
$map{"<BOX START>"}="<table>\n<td BGCOLOR=\"#FFDDDD\" >\n";
$map{"<BOX END>"}="</td>\n</table>\n";
$map{"<MAIN TEXT END>"}="</td>\n<td width=\"10%\" valign=\"top\"></td>\n</tr>\n</table>\n";
$map{"<START>"}="<html>\n";
$map{"<END>"}="<td width=\"10%\" valign=\"right\"></td></table>\n";

while($line=<>){
	$line =~ s/\r//;		#改行を削除する
	$line =~ s/\n//;		#改行を削除する
	if($map{$line}){
		print $map{$line};
	}else{
		print "$line\n";
	}
}


▼変換元となるテキストファイルの作成
a.txt として保存しました

<START>
<body bgcolor="#00ffff">
<MAIN TEXT START>
<center>タイトル</center><br>
<TEXT START>

aaa<br>
bbb<br>
ccc<br>

<TEXT END>
<br>
<TEXT START>

<BOX START>
aaaa<br>
bbbb<br>
<BOX END>
cccccccc<br>

<TEXT END>
<END>


▼プログラムを実行して、出力結果の a.html ファイルをブラウザで開きました

$ cat a.txt | perl test.pl > a.html





形が決まっているHTMLファイルを作成する時に便利そうです



20061014 作成


▲トップページ > perl 関連