電子書籍の厳選無料作品が豊富!

Perlの勉強中なのですが、テキストファイルに書かれた特定の複数行を
コメント行として編集(置換)したいのですが、うまく出来ずに悩んで
います、、、。
アドバイス頂けると助かります。

■やりたい事
以下のようなテキストファイル(test.txt)が有ったとして、
===========ここから
abcdefg
hijklmn

xxyyzz [aaa bbb
ccc ddd
eee fff]

opqrstu
vwxyz
===========ここまで
xxyyzzから最初に現れる"]"までをマッチさせ、
その行頭に"## "を挿入する。
===========ここから
abcdefg
hijklmn

## xxyyzz [aaa bbb
## ccc ddd
## eee fff]

opqrstu
vwxyz
===========ここまで

■試したこと
===========ここから
#! /usr/bin/perl

my $file = 'test.txt';

open my $fh, '<', $file
or die "Can't open $file: $!";
my $page = do { local $/; <$fh> };

my $str1 = '';
if ( $page =~ m|(xxyyzz \[.+?\]\n)|s ) {
$str1 = $1;
$str1 =~ s/^/## /mg;
print "$str1";
}
===========ここまで

複数行マッチまではなんとか辿り着いたのですが、当然このやり方では
マッチした行しか出力させられず、途方に暮れています、、、。

なにかヒントを頂けると嬉しいです。
宜しくお願いします。

A 回答 (1件)

ん~と, 文章では「xxyyzzから最初に現れる"]"までをマッチさせ、」ってなってるけどスクリプトの方は「xxyyzz [ から最初の『行末の』] まで」になってるよ. どっち?



まあどっちにしても, 複数行マッチじゃなくってフラグを 1個使えばいいような気がする. 例えばスクリプトにあわせるなら

my $in_comment = 0;
while (<>) {
$in_comment = 1 if /xxyyzz \[/;
s/^/## / if $in_comment;
$in_comment = 0 if /\]$/;
print;
}

のような感じ. .. を使えればもっと簡単なんだけど, この場合にはあわないんだよね.
    • good
    • 0
この回答へのお礼

Tacosanさん、
早速の回答ありがとうございました。

> 文章では,,

すいません、サンプルで載せたスクリプト例の方が間違いです、、、。
xxyyzzの後の"["はどこに登場するか分からないので、文章の方が正しいです。
特定のキーワードをフラグにして動作するようにすれば、確かに複数行マッチに
こだわる必要ありませんね。

一行でif文を書けるのですね、勉強になります。
実はキーワードに応じて編集内容を変える必要があるのですが、教えて頂いた
方法で試してみたいと思います。

ありがとうございました。

お礼日時:2020/02/12 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!