- 締切済み
複数行になっている文字列を検索したい
PERL初心者です。 以下、テキストに複数行になっている箇所の2行目の「BBB」を検索キーとして 3行目の「CCC」を取得したいのと2行目、3行目を1レコードにしたいのですが できません。 test.txt ---------------------------------- 1. AAA BBB CCC DDDD 2. AAA BBB 3. CCC DDDD 4. AAA BBB CCC DDDD ----------------------------------- 以上よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- zxcv0000
- ベストアンサー率56% (111/196)
No.2です。 > 1.不特定行にあるBBBをサーチしてCCCとDDDがあるかをチェックします。 > 2.CCCとDDDが見つからなければ次の行をサーチします。 > 3.CCCとDDDが見つかればBBBの見つけた行と結合する。 > 4.対象がなければ終了。 まだ、プログラミング可能なレベルに仕様が決まりませんね。 こういう事ですか? 1 最初の BBB を探す。 2 見付けた BBB の位置より後の DDD を探す。 無ければ終了。 (検索範囲を、同じ行と次の行に限定する必要がありますか?) 3 見付けた DDD の直前の単語(例では CCC)を得る。 4 見付けた BBB と DDD の間にある改行を全てスペースに置換して行を結合する。 5 処理終了。 (他に BBB があっても処理しなくて良いですか?)
- Tacosan
- ベストアンサー率23% (3656/15482)
基本的には「それをそのまま書く」ことになるかと. ループ 1回分が if (/BBB/) { if (/CCC/ && /DDD/) { print; } else { my $l = <>; if ($l =~ /CCC/ && $l =~ /DDD/) { chomp; print "$_ $l\n"; } else { print; $_ = $l; redo; } } } else { print; } とか.
- zxcv0000
- ベストアンサー率56% (111/196)
やりたい事を、例示では無く文章で説明してください。 例示は無数の解釈ができるので、何がやりたいかが判らないです。 例えば以下の様に『規則』そのものを説明してください。 1 行末に BBB を含む行を探す。 無ければ終了。 2 見付けた行の次の行の最初の単語を得る。 3 見付けた行と次の行を結合して 1行にする。 4 1に戻る。
- Tacosan
- ベストアンサー率23% (3656/15482)
あなたが何をしたいのか, もっと明確に記述してください. 「2行目の『BBB』を検索キーとする」とはどのような意味ですか? 通常「何行目か」というのは「検索キー」には入れないと思うのですが, 「2行目だけ」を対象とすればいいのですか? あるいは, 「2行目に『BBB』を含まない」ときにはどうするのですか? また, 「2行目, 3行目を 1レコードにしたい」というのは, 他の条件には全く無関係に「2行目と 3行目を 1レコードにする」だけでいいのですか? あるいは, この「2行目と 3行目」というのは「何らかの条件を満たす行とその次の行」という意味ですか? もしそうなら, 「何らかの条件」をきちんと示してください.
補足
質問に対して説明不足で大変申し訳ありません。 以下のような処理をしたいと思っています。 1.不特定行にあるBBBをサーチしてCCCとDDDがあるかをチェックします。 2.CCCとDDDが見つからなければ次の行をサーチします。 3.CCCとDDDが見つかればBBBの見つけた行と結合する。 4.対象がなければ終了。 編集前 -------------------------------- AAA BBB CCC DDD ← サーチ対象 AAA BBB CCC DDD --------------------------------- 編集後 -------------------------------- AAA BBB CCC DDD ← サーチ対象 AAA BBB CCC DDD --------------------------------- 以上よろしくお願いします。