重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

---あああああああああああああ----------------
いいいいいいいいいい
ううううううううううううう
[2013/07/10 00:00:00] ええええ
[2013/07/10 00:00:01] おおおお

上記のようなデータが複数格納されたファイルを読み込み、出力が

---あああああああああああああ----------------
2013/07/10 00:00:00,ええええ
2013/07/10 00:00:01,おおおお

となるようなプログラムをperlで実現させたいと考えていますがうまくいきません。
文字列のマッチング等試してみましたが期待する結果が得られませんでした。
ご教授よろしくお願いします。

A 回答 (2件)

いくらでも方法はあります。



例えば。
「行の先頭にある[XXXX] の中を取り出し、 XXXX , の置換する」
と考えれば
s/^\[([^]]*)\]/$1,/
※ \[ と \] の間にある 0個以上の[^]] (]では無い文字。[^の直後の場合、]をエスケープしなくても大丈夫) を () でグループ化
※ 置換内容は、$1で先にグループした部分を引用
となります。

なお、置換に失敗したときは偽になるので、置換に成功した行だけ出力すればよいので、
print OUT if( s/^\[([^]]*)\]/$1,/ ) ;
で十分です。



Perlの正規表現は強力で、いろんなことができます。
正規表現そのものもそうですが
「どうやったら目的のものを得られるか」、いくつかのパターンを覚えておくとよいでしょう。
http://perldoc.jp/docs/perl/5.16.1/perlretut.pod
http://perldoc.jp/docs/perl/5.14.1/perlre.pod
    • good
    • 0
この回答へのお礼

ありがとうございました。おかげさまで期待通りの結果を出力することができました。

perl自体初めてでしたので戸惑うことが多かったのですが、丁寧に解説していただきそれぞれの記号が持つ意味、正規表現の仕方の一端を理解することができました。
今後もperlを使用する場面が少なからずあると思うので、地道に勉強していきたいと思います。

今回は本当にありがとうございました。

お礼日時:2013/07/11 09:37

具体的にどうやってだめだったのでしょうか?



例えば。
/[2013/07/10 00:00:00]/
みたいにしようとすると。
○[]は、「その中にある文字のうちのどれかにマッチ」という表現になるので、[という文字自体にはマッチしない
○ この場合 / は正規表現の区切りに使われているので、 / という文字列にマッチしない
となります。特殊な文字(メタ文字)は、\を付けると、その特殊な意味を失います
/\[2013\/07\/10 00:00:00\]/
また、区切りは、変更できます
m|\[2013/07\/10 00:00:00\]|
http://perldoc.jp/docs/perl/perlop.pod#Regexp32Q …

この回答への補足

早速の回答ありがとうございます。
マッチについてはまさにその部分で躓いておりました。ご助言いただいたことを参考に下のようなスクリプトをかいてみました。

open(IN,"in.txt") or die "失敗";
open(OUT,">out.txt") or die "失敗";
while (<IN>){
print OUT if /---/;
print OUT if /\[/ | s/[\[\].・]//g;
}
close(IN);
close(OUT);

結果:out.txt
---あああああああああああああ----------------
2013/07/10 00:00:00 ええええ
2013/07/10 00:00:01 おおおお

しかし、この記述の仕方では当然ながらカンマ区切りで出力することはできません。[が含まれる行だけを抽出して配列に格納し、それぞれ必要な要素に分割して出力しようとしましたが、記述の仕方等問題がありエラーになってしまいました。
そのあたりの方法についても教えていただければ幸いです。

補足日時:2013/07/10 16:24
    • good
    • 0

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