OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.153824
  • 閲覧数966
  • ありがとう数6
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 61% (92/150)

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
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル13

ベストアンサー率 24% (357/1463)

シェルのビルトインだけですか~あ。ちょっとしんどいかな。

(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

お礼率 61% (92/150)

ありがとう御座いました。
投稿日時 - 2001-12-12 17:19:01
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル12

ベストアンサー率 43% (280/638)

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

viであれば、

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

で出来るとおもうのですが。
補足コメント
lts107

お礼率 61% (92/150)

有難う御座います。
シェルスクリプトでの編集方法を
ご教授いただけると嬉しいのですが・・・
投稿日時 - 2001-10-19 11:48:26


  • 回答No.2
レベル11

ベストアンサー率 55% (155/280)

いくつかの具体的な条件がわからないと、正確な解は出せないです。 begin BBB と、それに対応する end の間に、他の end が入ったりはしないで しょうか?あるいは、対応する begin と end の字下げは確実に同じでしょう か? 編集とは具体的に何をするのでしょうか?あらかじめ用意してあるものと取り 替えるのか、内容を見て機械的な処理をほどこすのか。 簡単な場合には ...続きを読む
いくつかの具体的な条件がわからないと、正確な解は出せないです。

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

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

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

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

やりたいことの具体的な中身しだいです。
補足コメント
lts107

お礼率 61% (92/150)

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

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

入りません。

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

字下げは不確定です。

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

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

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

perlは全く知りませんが、awkは少し使えるので
awkで説明していただければ幸いです。
投稿日時 - 2001-10-19 12:49:56
  • 回答No.3
レベル9

ベストアンサー率 54% (39/72)

Cシェルでって言っている以上、Cシェルのビルトインコマンドのみで実現したいのではないでしょうか? exやsedを使ったらshellだけじゃないっすよね。 {意地の悪い読み方 :-P } shellのみでは私は実現不可能かきわめて困難とおもいます。 私自身はawk使いなので単純な作業ならawk,そうでないならperl最後はyacc(bison)の順番で考えるとおもいます。 shellでの実 ...続きを読む
Cシェルでって言っている以上、Cシェルのビルトインコマンドのみで実現したいのではないでしょうか? exやsedを使ったらshellだけじゃないっすよね。 {意地の悪い読み方 :-P }

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

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

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

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

お礼率 61% (92/150)

ありがとう御座いました。
投稿日時 - 2001-12-12 17:19:32
  • 回答No.5
レベル11

ベストアンサー率 55% (155/280)

まあ、シェルだけでやるというパズルは置いといて ^^ begin BBB -- end 間に他の end がないという前提ですね。 その間に限定した文字の置換でよければ、 sed -e '/begin BBB/,/end/s/前/後/' で実現できます。 1行に複数個置換対象があるなら、最後に g をつけます。 他のパターンもあれば、同じように並べれば済みます。 ...続きを読む
まあ、シェルだけでやるというパズルは置いといて ^^

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

お礼率 61% (92/150)

ありがとう御座いました。
投稿日時 - 2001-12-12 17:18:10
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ