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

Perlの正規表現について質問です.

■質問
aaa bbb
aaa bbb ccc "ddd"
aaa bbb ccc "ddd eee"
aaa bbb ccc ddd eee "fff ggg hhh iii"

というような,文字列が書かれているファイルがあるとします.

※ダブルクォーテーションが無い行もあります.
※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります.

これを,ダブルクォーテーションの中にあるスペースだけ
アンダーバーに置換する場合の正規表現を教えて下さい.

つまり,下記の出力にしたいです.
aaa bbb
aaa bbb ccc "ddd"
aaa bbb ccc "ddd_eee"
aaa bbb ccc ddd eee "fff_ggg_hhh_iii"

■条件
※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください.

※単に実現するだけなら,
# cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;'
みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

A 回答 (2件)

正規表現「のみ」では困難で、私なら、


#! perl -p
1 while (s/(\"[^" ]+) ([^"]+\")/$1_$2/);
ぐらいで妥協します。

ダブルクォーテーションに囲まれた文字列が1行に0~1個まで、
すなわち、以下のような行がないなら、もう少し簡略化できるでしょう。
aaa bbb ccc ddd eee "fff ggg hhh iii" "jjj kkk"
    • good
    • 0

ん~, 私も #1 と同じく「正規表現だけ」で書けるとはあんまり思えない (よしんば書けたとしても「簡単」にはならないと思う) けど....



あと, 「ちょっと古いPerl」ってどの辺を想定してます? 個人的には 5.8 より前は無視したいん.
    • good
    • 0

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