プロが教えるわが家の防犯対策術!

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

A 回答 (5件)

シェルのビルトインだけですか~あ。

ちょっとしんどいかな。

(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
のように起動して下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/12 17:19

まあ、シェルだけでやるというパズルは置いといて ^^



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 は出てこなくても大丈夫でしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/12 17:18

Cシェルでって言っている以上、Cシェルのビルトインコマンドのみで実現したいのではないでしょうか? exやsedを使ったらshellだけじゃないっすよね。

{意地の悪い読み方 :-P }

shellのみでは私は実現不可能かきわめて困難とおもいます。

私自身はawk使いなので単純な作業ならawk,そうでないならperl最後はyacc(bison)の順番で考えるとおもいます。

shellでの実装は最初から考えないです。

まあ、どちらにせよbeginとendの部分の詳しい構文ルールといろいろ編集の部分のやりたいことがわからないと最適なツールと実装方式は紹介できませんね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/12 17:19

いくつかの具体的な条件がわからないと、正確な解は出せないです。



begin BBB と、それに対応する end の間に、他の end が入ったりはしないで
しょうか?あるいは、対応する begin と end の字下げは確実に同じでしょう
か?

編集とは具体的に何をするのでしょうか?あらかじめ用意してあるものと取り
替えるのか、内容を見て機械的な処理をほどこすのか。

簡単な場合には sed だけでできたり、ed へのコマンドを適当に並べてやれば
できたりもします。複雑になれば、awk や perl を呼ぶ必要があるかもしれま
せん。

複雑な構文規則があって、どんな場合にも完璧に対応させたいとなると、perl
でも荷が重くて、C と yacc になったりします。

やりたいことの具体的な中身しだいです。

この回答への補足

説明不足ですいません。
補足しますので、またご教授願います。

>begin BBB と、それに対応する end の間に、
>他の end が入ったりはしないでしょうか?

入りません。

--
>あるいは、対応する begin と end の字下げは確実に同じでしょうか?

字下げは不確定です。

--
>編集とは具体的に何をするのでしょうか?

今回は、文字の置換を行います。
編集内容は、sed等を用いてすでにできています。
ただ、今後応用できるように略式で書いてみました。

--
>複雑になれば、awk や perl を呼ぶ必要があるかもしれません。

perlは全く知りませんが、awkは少し使えるので
awkで説明していただければ幸いです。

補足日時:2001/10/19 12:49
    • good
    • 0

cat、moreはエディターではないので、カットアンドペーストはできるのかなあ?



viであれば、

"ESC"キー > : 移動開始行 移動終了行 m 移動先行

で出来るとおもうのですが。

この回答への補足

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

補足日時:2001/10/19 11:48
    • good
    • 0

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