• ベストアンサー

【Cシェル】ファイルの切取り/挿入方法

Cシェル初心者です. 下記のようなファイルで"begin BBB"~"end"を切り取って(※(1)) いろいろ編集し、元のファイルの中に戻したい場合(※(2))の手順って どのようにしたらよいでしょうか? (1)切り取り方法の質問  ($1==begin、$2==BBBからendまでの切り取り) (2)編集後のファイルの挿入方法の質問。  (ファイルの途中への挿入方法) 以上、2点のご教授よろしくお願いします。 尚、環境はSolalis2.6です。 %cat file.txt begin AAA ・ ・   begin BBB   ・   ・   end ・ ・ end

質問者が選んだベストアンサー

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

シェルのビルトインだけですか~あ。ちょっとしんどいかな。 (1)切り取りコマンド #! /bin/csh -f # 起動方法 cmd fname # begin BBB から end までを fname で示されたファイルに出力する。 set FNAME = $1 set INPUT = $< while ( "$INPUT" != "" )  set CHECKBEGIN = `echo $INPUT | grep 'begin BBB'`  if ( "$CHECKBEGIN" != "" )   set FILEOUT  endif  if ( $?FILEOUT )   echo $INPUT >> $FNAME  endif  set CHECKEND = `echo $INPUT | grep end`  if ( "$CHECKEND" != "" )   if ( $?FILEOUT )    unset FILEOUT   endif  endif  set INPUT = $< end (2)挿入コマンド #! /bin/csh -f # 起動方法 cmd fname # begin BBB から end までを fname で示されたファイルで置き換える。 set FNAME = $1 set INPUT = $< while ( "$INPUT" != "" )  set CHECKBEGIN = `echo $INPUT | grep 'begin BBB'`  if ( "$CHECKBEGIN" != "" )   set EXCHANGE  endif  if ( $?EXCHANGE )   if ( ! $?FILEOUT )    cat $FNAME    set FILEOUT   endif  else   echo $INPUT  endif  set CHECKEND = `echo $INPUT | grep end`  if ( "$CHECKEND" != "" )   if ( $?EXCHANGE )    unset EXCHANGE   endif  endif  set INPUT = $< end 試してはいません。 空白が連続していると正しく出力できませんが、とりあえず。 どちらも標準入力から読みますから cmd fname < original_file のように起動して下さい。

lts107
質問者

お礼

ありがとう御座いました。

その他の回答 (4)

回答No.5

まあ、シェルだけでやるというパズルは置いといて ^^ begin BBB -- end 間に他の end がないという前提ですね。 その間に限定した文字の置換でよければ、 sed -e '/begin BBB/,/end/s/前/後/' で実現できます。 1行に複数個置換対象があるなら、最後に g をつけます。 他のパターンもあれば、同じように並べれば済みます。 置換されたファイルが file として既にあるなら、 sed -e '/begin BBB/r file' -e '/begin BBB/,/end/d' となります。 もし、一旦、該当部分をファイルとして取り出す必要があるなら、 sed -n '/begin BBB/,/end/p' >fff で取り出し、変更してから、上のようにしてやればOKです。 ここまでの程度であれば、awk は出てこなくても大丈夫でしょう。

lts107
質問者

お礼

ありがとう御座いました。

  • mph
  • ベストアンサー率54% (39/72)
回答No.3

Cシェルでって言っている以上、Cシェルのビルトインコマンドのみで実現したいのではないでしょうか? exやsedを使ったらshellだけじゃないっすよね。 {意地の悪い読み方 :-P } shellのみでは私は実現不可能かきわめて困難とおもいます。 私自身はawk使いなので単純な作業ならawk,そうでないならperl最後はyacc(bison)の順番で考えるとおもいます。 shellでの実装は最初から考えないです。 まあ、どちらにせよbeginとendの部分の詳しい構文ルールといろいろ編集の部分のやりたいことがわからないと最適なツールと実装方式は紹介できませんね。

lts107
質問者

お礼

ありがとう御座いました。

回答No.2

いくつかの具体的な条件がわからないと、正確な解は出せないです。 begin BBB と、それに対応する end の間に、他の end が入ったりはしないで しょうか?あるいは、対応する begin と end の字下げは確実に同じでしょう か? 編集とは具体的に何をするのでしょうか?あらかじめ用意してあるものと取り 替えるのか、内容を見て機械的な処理をほどこすのか。 簡単な場合には sed だけでできたり、ed へのコマンドを適当に並べてやれば できたりもします。複雑になれば、awk や perl を呼ぶ必要があるかもしれま せん。 複雑な構文規則があって、どんな場合にも完璧に対応させたいとなると、perl でも荷が重くて、C と yacc になったりします。 やりたいことの具体的な中身しだいです。

lts107
質問者

補足

説明不足ですいません。 補足しますので、またご教授願います。 >begin BBB と、それに対応する end の間に、 >他の end が入ったりはしないでしょうか? 入りません。 -- >あるいは、対応する begin と end の字下げは確実に同じでしょうか? 字下げは不確定です。 -- >編集とは具体的に何をするのでしょうか? 今回は、文字の置換を行います。 編集内容は、sed等を用いてすでにできています。 ただ、今後応用できるように略式で書いてみました。 -- >複雑になれば、awk や perl を呼ぶ必要があるかもしれません。 perlは全く知りませんが、awkは少し使えるので awkで説明していただければ幸いです。

  • ojin
  • ベストアンサー率43% (280/638)
回答No.1

cat、moreはエディターではないので、カットアンドペーストはできるのかなあ? viであれば、 "ESC"キー > : 移動開始行 移動終了行 m 移動先行 で出来るとおもうのですが。

lts107
質問者

補足

有難う御座います。 シェルスクリプトでの編集方法を ご教授いただけると嬉しいのですが・・・

関連するQ&A