シェルスクリプト総合 その7

708名無しさん@お腹いっぱい。
sedでhoge.datというファイルを編集するときに

sed 's/aaa/bbb/' hoge.dat > tmp.dat
mv tmp.dat hoge.dat

のようにして、一時的なファイルとしてtmp.datというファイルを用意するのが無駄だと
思うのですが、このような一時的なファイルを使わないで
直接、hoge.datをsedで編集する方法はありませんでしょうか?

m(_ _)m
709名無しさん@お腹いっぱい。:2007/01/12(金) 01:08:30
>>708
・-i オプションをつかう
・-i オプションがないsedをつかっているなら in-place editing 対応の sed の導入を検討する
・ed をつかう
・perl を使う
・一時ファイルを必要としないファイル命名法を検討する

お好みで
710名無しさん@お腹いっぱい。:2007/01/12(金) 01:10:26
GNU sedには-iオプションがある。BSDのもある。

あとinplaceというあらゆるフィルタをin-place editに使うコマンド
もある。(これはぐぐって)
711名無しさん@お腹いっぱい。:2007/01/12(金) 01:20:43
FreeBSD の標準 sed に -i オプションが取り入れられたのは 4.7R でそれ以前には無い。
NetBSD の標準 sed には -i オプションは無い。 
OpenBSDの(ry
以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 )
712名無しさん@お腹いっぱい。:2007/01/12(金) 01:29:18
MacOSXのBSD由来のsedにはあるみたいだな。いつのだろ。
713名無しさん@お腹いっぱい。:2007/01/12(金) 01:33:43
>>710
http://www.idaemons.org/projects/inplace/
へー、これか。
これは知らなかった。
714名無しさん@お腹いっぱい。:2007/01/12(金) 01:35:17
>>712
MacOSXのFreeBSDなユーザーランドは 最初は FreeBSD 3.xR由来で
そのうちに 5.x由来とかのになってそれから先はシラネ。
でも5.x以降だろうなと推測。
715名無しさん@お腹いっぱい。:2007/01/12(金) 01:45:52
>>714
/usr/share/misc/bsd-family-tree あたりにちゃっかり書いてあったりする。
716名無しさん@お腹いっぱい。:2007/01/12(金) 01:52:33
そのディレクトリの中はじめて見た。
flowers(花言葉)とかbirthtoken(誕生石)とか、妙なファイルもあるんだな。
717名無しさん@お腹いっぱい。:2007/01/12(金) 01:55:54
>>716
お、ほんとだ
なんでもあるな
718名無しさん@お腹いっぱい。:2007/01/12(金) 01:57:43
>>715
なるほど
でもそのファイルにNeXTの話がないのが微妙
719名無しさん@お腹いっぱい。:2007/01/12(金) 17:59:42
>>708
UNIXのファイルシステム上だと
(rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat
でOK
720名無しさん@お腹いっぱい。:2007/01/12(金) 18:11:02
>>719
なるほど
721名無しさん@お腹いっぱい。:2007/01/12(金) 18:31:57
ああ、なるほど。
722名無しさん@お腹いっぱい。:2007/01/12(金) 19:50:06
あ、アナルほど
723名無しさん@お腹いっぱい。:2007/01/12(金) 20:44:54
手順をトレースしてみました。こんな理解でよろしいでしょうか。

1. < hoge.dat
ファイルディスクリプタを確保する。(&標準入力にする)
このディスクリプタが開いている限り、ファイル名がなくなっても
ファイルの実体は消えない。
2. (...)
サブシェルを起動する。ファイルディスクリプタは継承される。
3. rm hoge.dat
hoge.datというディレクトリエントリ(ファイル名)を消す。
しかし、それが指していた実体は1.のディスクリプタからまだ参照
されているため、消えない。
4. >hoge.dat
別途hoge.dat という名前でファイルを開く。(&標準出力にする)
これは、もとのhoge.datが指していた実体とは別のディスク領域に書かれる。
5. 全体が終了すると、ファイルディスクリプタが閉じ、もとのファイル実体
が使っていたディスク領域が未使用状態とみなされる。
724名無しさん@お腹いっぱい。:2007/01/13(土) 01:27:34
>>719
(...)じゃなくて{...;}じゃダメ?
725名無しさん@お腹いっぱい。:2007/01/13(土) 02:33:57
>>724
自分でまずやってみろよ
726名無しさん@お腹いっぱい。:2007/01/14(日) 01:54:35
最近のシェルは`test`や`[`が組み込みコマンドになってるとのことで
確かにpowerpc-apple-darwin8.0のbash 2.05b.0(1)-releaseでは`builtin`で呼び出せることも確認しました
一方で/bin/[や/bin/testも存在し、当然実行可能でした
また、若干の差異はありますが、複合コマンド(compound command)の`[[ expression ]]`もほぼ同じ用途に利用できます

そこで質問なんですが、少し上で話されていたような処理の重さ(無駄なプロセスの生成等)を考えた場合、
どれを使うのがベストなんでしょう?
727名無しさん@お腹いっぱい。:2007/01/14(日) 02:03:12
当然内部コマンドでしょう。
つーか、パフォーマンス重視な場合は
シェルスクリプトなんか使うな。