
皆さんのお知恵をお貸し頂ければ幸いです。
Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。
example.log
==================================
aaaa
bbbb START
hogehoge
cccc START
test
okok
perl
eeee END
script
==================================
上記ファイルを読み込んで、「cccc START」から「eeee END」の間に挟まれた行だけ抜き出したいのです。
いろいろ試してみましたが、どうしても初めの「bbbb START」から「eeee END」まで出力されてしまいます。
このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。
それでは、どうぞよろしくお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
foreach (<>) {
if(/\bSTART$/){$f=1,$x=""}
elsif($f && /\bEND$/){print $x;$f=0}
elsif($f){$x.=$_}
}
No.3
- 回答日時:
本当に
「cccc START」から「eeee END」の間
であるなら, しかるべく指定すれば
どうしても初めの「bbbb START」から「eeee END」まで出力されてしまいます
なんてことにはならないよ.
さておき, #2 と同じ方針だけどたとえば
open my $fh, '<', 'example.txt' or die "file open error\n";
$_ = do {
local $/ = undef;
<$fh>;
};
my ($target) = m/.*\sSTART$(.*)\n[^\n]*\sEND$/ms;
print "$target\n";
とか?
No.2
- 回答日時:
こんな感じ?
my $str = "";
my $ret = "";
open(DATAFILE, "< example.log") or die("error :$!");
while (my $line = <DATAFILE>){
chomp($line);
$str = "$str$line\n";
}
close DATAFILE;
if ($str =~ /cccc START([\s\S]+)eeee END/){
$ret = $1;
}
print "$ret";
No.1
- 回答日時:
STARTの次の行から出力ではなく、内部にためるようにしないとだめです。
ためている最中にSTARTがきたら、いままでためていたのを破棄します。
ENDがきたら、たまっていたもの吐き出します。
open(INFILE,"example.log");
@lines = ();
$flag = 0;
while(<INFILE>){
if ($_ =~ m/\sSTART$/){
$flag = 1;
@lines = ();
next;
}
if ($flag == 1){
if ($_ =~ m/\sEND$/){
$flag = 0;
&flush();
next;
}
push(@lines,$_);
}
}
close INFILE;
sub flush()
{
foreach $line (@lines){
print $line;
}
@lines = ();
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
htmlから、ファイル、もしくはC...
-
「print関数は出力先のファイル...
-
バッチファイルで、記号を含む...
-
エクセルVBAで素数だけを出力す...
-
warnやdieの出力先を変更したい
-
perlでモジュールを使ってクロ...
-
重複するデータを抽出できる秀...
-
[Perl]ファイル出力のエンコー...
-
Perl<->Oracle間での文字化けに...
-
[awk]uniq -cで複数ファイルの...
-
リファレンスについて。
-
ディレクトリ名を取得したい
-
エクセルVBA コードが同じでも...
-
cookieを必要とするページへのLWP
-
C言語で特定の行を抽出する方法...
-
Windowsで複数のファイルを同じ...
-
ReadLineでの読み出し行を指定する
-
バッチファイルの作り方(CSV→...
-
テキストファイルの各行を配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
DOSコマンドで、標準出力を出力...
-
sprintfについて
-
[Perl]ファイル出力のエンコー...
-
文字コードの変換(Shift-JISか...
-
重複するデータを抽出できる秀...
-
エクセルVBAで素数だけを出力す...
-
テキストファイルから日本語部...
-
HTML::Templateの空行について
-
教えて!perlから.exeファイル...
-
ファイル出力の改行コードをLFに
-
Perl<->Oracle間での文字化けに...
-
Perlでファイルの末尾から指定...
-
エディターでは改行なのにメモ...
-
バッチファイルで、記号を含む...
-
Perl で出力するHTMLファイルを...
-
ファイル内のキーを元に別のフ...
-
Perlで着メロDLカウント
-
timeコマンドの結果をテキスト...
-
エクセルVBA コードが同じでも...
おすすめ情報