質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

4回答

4118閲覧

perl 検索範囲指定

yabu12

総合スコア12

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2017/10/11 10:43

編集2017/10/11 10:49

###前提実現したいこと
perlでhoge.txtのデータの一部を置換してhogehoge.txtにコピーしたいと考えています。

hoge.txtの中身

<ccc> abcdefg </yyy> <aaa> ABCDEFG </xxx> <ccc> abcdefg </yyy> <aaa> ABCDEFG </xxx>

hoge.txtの
<aaa>の範囲から</xxx>の範囲までを指定しコピーする。
それ以外は、NEXTでとばしたいと考えています。

hogehoge.txt

<bbb> ABCDEFG </zzz> <bbb> ABCDEFG </zzz>

イメージですが、このようにしたいです。

 
###発生している問題・エラーメッセージ
hoge.txtの
<aaa>の範囲から</xxx>の範囲までをコピ-したいのですが、
現状<aaa>の部分から、一番下の</xxx>まで書きだしてしまってる問題があります。
下記の文で範囲をしていしてしまっているためだと思います。
if($line = /\aaa>/ .. /</xxx>/)

現状hogehoge.txtの中身

<bbb> ABCDEFG </zzz> <ccc> abcdefg </yyy> <bbb> ABCDEFG </zzz>

###該当のソースコード

#!/usr/bin/perl
use utf8;
use strict;

open(IN,"<","hoge.txt");

open(OUT,">>","hogehoge.txt")or die"error:$!";
while (my $line = <IN>) {
if($line = /\aaa>$/ .. /</xxx>$/){
$line = ~s/<aaa>/^<bbb>/g;
$line = ~s/</xxx>/</zzz>/g;
print OUT $line;
}else{
next
}
}
close(IN);
close(OUT);
###試したこと
開始値、終了値やフラグをなど調べてみましたが私の理解が足りず力不足でした。

###補足情報(言語/FW/ツール等のバージョンなど)
言語 perl

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

とりあえずこれでどうでしょうか

perl

1open(IN,"<","hoge.txt"); 2open(OUT,">>","hogehoge.txt")or die"error:$!"; 3 4my $write = 0 ; 5while (<IN>) { 6 if(/^</xxx>$/) { 7 print OUT $_; 8 $write = 0; 9 } elsif(/^<aaa>$/) { 10 $write = 1 ; 11 print OUT $_; 12 } elsif ($write) { 13 print OUT $_; 14 } 15} 16close(IN); 17close(OUT);

投稿2017/10/11 11:18

scsi

総合スコア2840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yabu12

2017/10/11 11:33

回答ありがとうございます。 さっそく実践したいと思います!!
guest

0

こういうことじゃなくて?

perl -nle 'next if /^<aaa>$/../^</xxx>$/; print;' hoge.txt > hogehoge.txt

投稿2017/10/11 11:39

編集2017/10/11 11:39
ernix

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yabu12

2017/10/11 12:24

回答ありがとうございます perlのワンライナーってものですかね。 ありがとうございます。 しっかり、試させていただきます。
guest

0

パターンマッチ演算子の使い方がおかしいです。 =~の文法を確認して下さい。

perl

1while (my $line = <IN>) { 2 if($line =~ /<aaa>/ .. $line=~/</xxx>/){ 3 $line =~ s/<aaa>/<bbb>/g; 4 $line =~ s/</xxx>/</zzz>/g; 5 6 # 上のは下の様に書いた方が良い。 7 # $line =~ s{</xxx>}{</zzz>}g; 8 9 print OUT $line; 10 }else{ 11 next 12 } 13} 14

投稿2017/10/11 11:21

編集2017/10/11 12:48
KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yabu12

2017/10/11 11:36

回答ありがとうございます。 \が非常に汚くなってしまい困っていたところでした。 $line =~ s{</xxx>}{</zzz>}g;のように直させていただきます。 ありがとうございます。
guest

0

ベストアンサー

perlでないとだめでしょうか。

sedならこう。

bash

1sed -n '/^<aaa>$/,/^</xxx>$/p' hoge.txt | sed -e 's/^<aaa>$/<bbb>/g' -e 's/^</xxx>$/</zzz>/g' > hogehoge.txt

perlならこうでしょうか。

perl

1#!/usr/bin/perl 2 3use utf8; 4use strict; 5 6open(IN,"<","hoge.txt"); 7 8open(OUT,">>","hogehoge.txt")or die"error:$!"; 9 10my $text = ''; 11while (my $line = <IN>) { 12 $text .= $line; 13} 14 15while($text =~ /<aaa>.*?</xxx>/s){ 16 my $tmp = $&; 17 my $match = $&; 18 $match =~ s/^<aaa>$/<bbb>/m; 19 $match =~ s/^</xxx>$/</zzz>\n/m; 20 print OUT $match; 21 $text =~ s/$tmp//s; 22} 23 24close(IN); 25close(OUT);

投稿2017/10/11 10:50

編集2017/10/11 11:39
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yabu12

2017/10/11 11:07

回答ありがとうございます。 sedについて調べてみます。 可能であるならperlで行いたいと考えています。
yabu12

2017/10/11 11:46

perlでの方法まで書いていただきありがとうございます。 今回はperlということで質問させていただきましたが 今後、sedなども使用するように視野を広げていきたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問