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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qpostfix:aaa.bbb.ac.jpからしか送信できないのをbbb.ac.jpがつけば送信できるようにしたい。

RHL9.0でpostfixを使用しています。
現在ホスト名がmail.aaa.bbb.ac.jpのメールサーバがあります。***.aaa.bbb.ac.jp(123.4.56.*)というDNS登録がされていればクライアントから送信できます。しかし、***.ddd.bbb.ac.jp(123.4.78.*)と建物が違うためにmain.cfのmydomain=aaa.bbb.ac.jpではないPC(ただし、メールアドレスは@aaa.bbb.ac.jp)からは送信できません。これをbbb.ac.jpとつけばメールの送信がかのうとするにはmain.cfのどこを書き換えればよいのでしょうか。mydomainをbbb.ac.jpとするのでしょうか?

以下はmain.cfの一部です。

myhostname=mail.aaa.bbb.ac.jp
mydomain=aaa.bbb.ac.jp
mynetworks = 123.4.56.0

Aベストアンサー

/24というのはサブネットなんで現在のネットワークにあわせたものに変更して欲しいですが。
/24ではこの場合にはダメなのでは?
255.255.0.0のようなケースなら/16のように指定が必要でしょう。
ドキュメントやgoogleなどで見た感じではこれに加えて
smtpd_recipient_restrictions = permit_mynetworks,check_relay_domains
としておけば大丈夫だと思えるのだけど。
この場合では
myhostname = aaa.bbb.ac.jp
mydomain=bbb.ac.jp
のようにあげないとダメだとは思いますけど。

頑張ってみてください。
PostfixはLinuxでは結構入っているので知っている人が多そうですがフォロー出てきませんね?
あまり使ったことがないので申し訳ない程度に

QSolalisでCDドライブのOPENの仕方が分かりません

Solarisでソフトのインストールをしたいのですが、
やり方以前にCDドライブの開け方が分かりません。
どなたかお分かりになる方、よろしくお願いします。

Aベストアンサー

mountしっぱなしだったら、umountでマウントを解除してあげて、
eject cdrom
で取り出せます。

mountしてない場合は、そのまま
eject cdrom
でイジェクトできます。

SunOS 4.x,Solaris2.5&2.6で確認済み。

QVine Linux 2.6 でC言語で開発

Vine Linux 2.6をインストールの種類でワークステイションを選択してインストールしました。
が、自作したC言語のプログラムをコンパイルしようと思いましたが、「gcc」コマンドが無いようです。
ワークステイションを選択してインストールするとgccはインストールされないのでしょうか?
また、インストールされていなかったとしたらインストール方法を教えてください。

Aベストアンサー

そのマシンがネットに接続できているなら、

# apt-get -yf gcc

と実行すれば、VineLinuxのサイトからgcc関連をインストールできます。

または、rpmコマンドでVineLinuxのCDROMから

gcc-c++-2.95.3-2vl22
gcc-tools-2.95.3-2vl22
gcc-docs-2.95.3-2vl22
gcc-cpp-2.95.3-2vl22
gcc-2.95.3-2vl22

等をインストールしてみてください。
(バージョン番号は違うと思います)

QWordでページ設定を引き継いだままファイルの挿入

仕事でいろんな人が作ったWord文章を一つにまとめることになりました。

しかしセクション区切りをしてもファイルの挿入をすると、ページ設定は引き継いで挿入できないので、挿入するたびに余白等の設定をやり直さなければなりません。
一つか二つだけなら直そうという気持ちになるのですが、全部で100個くらいのファイルがあるそうです。

どうにかページ設定を引きついだままファイルの挿入は出来ないでしょうか?

知恵をお願い致します。

Aベストアンサー

メニューの[挿入]→[ファイル]ではページ設定等は無理なので、
[セクション区切り]の[次のページから]を選択しておいてから、
挿入元だったファイル開いて中身を全選択しコピーします。

[編集]→[形式を選択して貼り付け]→[リッチテキスト形式(RTF)]
を実行してみては。

図などのレイアウトが一部崩れることがあるかもしれませんが、
ページ設定などはコピー元と大体同じになりますから。
お試しを。

ただし、100個のファイルでこれを繰り返すのは少し大変ですね。
マクロで出来れば良いのでしょうが、私は苦手なので他の優秀な
回答者に任せます。

QRedHat7.3でLogWatch 2.6 Begin の内容をおしえてください

RedHat7.3でサーバーを構築しております。
LogWatch 2.6 Beginというメールがルート宛てに毎日午前4時に届くようになっています。この内容を知りたいのですがどなたかご教授おねがいします

Failed FTP Logins:
pa214.zory.sdi.tpnet.pl (217.96.208.214): ftp - 1 Time(s)
**Unmatched Entries**
wu-ftpd - TLS settings: control allow, client_cert allow, data allow
wu-ftpd - TLS settings: control allow, client_cert allow, data allow
ACCESS DENIED (not in any class) TO pa214.zory.sdi.tpnet.pl [217.96.208.214]

------- Connections (secure-log) Begin -----
Connections:
Service pop3:
   218.231.49.67: 1 Time(s)
192.168.0.2: 1 Time(s)
218.231.51.180: 1 Time(s)
Service ftp:
192.168.0.2: 1 Time(s)
217.96.208.214: 2 Time(s)
こんな感じですが・・
なぜお聞きしたいかというと、まだ、サーバーを公開していないのに知らないIPが
出てくるので少し不安になりました。

RedHat7.3でサーバーを構築しております。
LogWatch 2.6 Beginというメールがルート宛てに毎日午前4時に届くようになっています。この内容を知りたいのですがどなたかご教授おねがいします

Failed FTP Logins:
pa214.zory.sdi.tpnet.pl (217.96.208.214): ftp - 1 Time(s)
**Unmatched Entries**
wu-ftpd - TLS settings: control allow, client_cert allow, data allow
wu-ftpd - TLS settings: control allow, client_cert allow, data allow
ACCESS DENIED (not in any class) TO pa214.zory.sdi....続きを読む

Aベストアンサー

>ということは、217.96.208.214から不正にログインしようとしている人間がいるということですね・・・

残念ながら、ログをみただけでは、不正かどうかは判断できないですよね。

サーバの関係者が自宅でプロバイダ経由でログインを試してみた、という事もかんがえられますし。
サーバの関係者が外部からログインできない事を確認した、という事もかんがえられます。

FTPを外部に公開されるのでしたら、この手のログ記録はたくさん発生します。

サーバ公開後はログ監視ソフト(LogWatch)の定義の見直しが必要になると思います。

また、LogWatchにまかせっぱなしではなく、/var/log配下のログファイルを直接開いて見る事をおすすめします。

LogWatchのデフォルトの設定では検出できない、不正アクセスの記録があるかもしれませんので。


>またFTPはアクセスされていないということもいえるんですね?

正確に言うと、アクセスはされているがログインできなかった、という意味ですね。

FTPを外部に公開するなら、anonymousFTP(ダウンロード専用)にしてしまう、という手もありますね。

あとwu-ftpdをお使いの様ですが、ProFTPDの方がセキュリティの設定とか機能が多いのでおすすめです。

>ということは、217.96.208.214から不正にログインしようとしている人間がいるということですね・・・

残念ながら、ログをみただけでは、不正かどうかは判断できないですよね。

サーバの関係者が自宅でプロバイダ経由でログインを試してみた、という事もかんがえられますし。
サーバの関係者が外部からログインできない事を確認した、という事もかんがえられます。

FTPを外部に公開されるのでしたら、この手のログ記録はたくさん発生します。

サーバ公開後はログ監視ソフト(LogWatch)の定義の見直...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報