- 締切済み
スクリプトファイル編集について
ファイル編集について勉強なのですがどうしてもできません。 複数ファイル内よりIF構文を見つけてFILE_A.txtのIF書式へ変換する。 ※編集前にFILE_B.txtの変更箇所をコメント化して編集後に変換、 FILE_A.txtの書式であれば編集しない処理を作りたいと思うのですが・・・ FILE_A.txt if [ $? != 0 ] ; then echo "てすと" fi 編集前 FILE_B.txt -- if [ -f $file ] then echo "てすと" fi 編集後 FILE_B.txt -- #if [ -f $file ] #then if [ -f $file ] ; then echo "てすと" fi 以上よろしくおねがいします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- MAGNAFIFTY
- ベストアンサー率69% (9/13)
難しいねぇ、Kシェルだっけ?Bシェル?ははは。複数行にわたってパターンを検出するのは、たまにイラっとするけど、しかたないね。nahaha596さんの言いたいであろう事を想像するに・・・複数行にわたる、if-then構文 if <expr> then を見つけたら、元をコメントアウトして単数行のif-then構文 # if <expr> # then if <expr> ; then に直す。どお?履歴を残すあたり、仕事っぽいな。複数ファイル内っていうのは、また、別問題、複数ファイルを扱うときは、僕なら、perl内では使わない。こういうのをフィルタとか言ったりします。というわけで、無責任ながら、下記の要領はどうかな? ---------- ここから ---------- //===== Open files and read script ===== open FH, "FILE_A.txt"; open FO, "FILE_A_NEW.txt"; @script = <FH>; //===== Loop script lines (but not last line) ===== for $i ( 0 .. $#script-1 ) { $line_current = $script[$i]; $line_next = $script[$i+1]; // Case, multi-line if statement if( $line_current =~ /if/ && $line_next =~ /then/ ) { // Comment out print FO "#$line_current"; print FO "#$line_next"; // Generate and output new statement chomp $line_current; chomp $line_next; print FO "$line_current ; $line_next\n"; $i++; } // Case, unmatch else { print FO "#$line_current"; } } //===== Purge last line if remain ===== if( $i == $#script-1 ) { print FO $script[$#script]; } ---------- ここまで ---------- Tacosanさんの言ってる事わかる?大事な事だよ。私の示したスクリプトは、安易なマッチングしかしていなくて、Bシェルスクリプトの構文解析には程遠いです。もし、質問が学校の宿題程度ならかまいませんが、仕事の依頼なら話にはならないです。また、仕事の依頼を受けるなら、Tacosanさんの言うようなアプローチが必要です。でないと、無限のデバッグ作業が待っています(笑)。蛇足ながら、本気で構文解析を行い強力なフィルタを作りたいなら、YACCとLEXのライブラリを使うのが近道かもしれません。 でも、まあ・・・なんだ、質問を明確に出来る実力があると、質問することもなくなって来るんだろうけどね。がんばれ~。
- Tacosan
- ベストアンサー率23% (3656/15482)
やりたいことが見えないんですけど.... 例えば FILE_A.txt が if mount | grep '/usr/bin' > /dev/null 2>&1 then echo "hello" fi で FILE_B.txt が if test -f $file \ -o -d $dir\ ; then echo "go fish"; fi だったときにはどうすればいいんでしょうか? こういう場合も含めて, 「どうなってほしいのか」を「言葉で明確に」表現してください. 例示するのは「わかりやすいといえばわかりやすい」のですが, 例が全てを尽していないときには「言及されていないところをどうするのか」で悩むことになりかねません.