708 :
名無しさん@お腹いっぱい。:
sedでhoge.datというファイルを編集するときに
sed 's/aaa/bbb/' hoge.dat > tmp.dat
mv tmp.dat hoge.dat
のようにして、一時的なファイルとしてtmp.datというファイルを用意するのが無駄だと
思うのですが、このような一時的なファイルを使わないで
直接、hoge.datをsedで編集する方法はありませんでしょうか?
m(_ _)m
>>708 ・-i オプションをつかう
・-i オプションがないsedをつかっているなら in-place editing 対応の sed の導入を検討する
・ed をつかう
・perl を使う
・一時ファイルを必要としないファイル命名法を検討する
お好みで
GNU sedには-iオプションがある。BSDのもある。
あとinplaceというあらゆるフィルタをin-place editに使うコマンド
もある。(これはぐぐって)
FreeBSD の標準 sed に -i オプションが取り入れられたのは 4.7R でそれ以前には無い。
NetBSD の標準 sed には -i オプションは無い。
OpenBSDの(ry
以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 )
MacOSXのBSD由来のsedにはあるみたいだな。いつのだろ。
>>712 MacOSXのFreeBSDなユーザーランドは 最初は FreeBSD 3.xR由来で
そのうちに 5.x由来とかのになってそれから先はシラネ。
でも5.x以降だろうなと推測。
>>714 /usr/share/misc/bsd-family-tree あたりにちゃっかり書いてあったりする。
そのディレクトリの中はじめて見た。
flowers(花言葉)とかbirthtoken(誕生石)とか、妙なファイルもあるんだな。
>>715 なるほど
でもそのファイルにNeXTの話がないのが微妙
>>708 UNIXのファイルシステム上だと
(rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat
でOK
ああ、なるほど。
あ、アナルほど
手順をトレースしてみました。こんな理解でよろしいでしょうか。
1. < hoge.dat
ファイルディスクリプタを確保する。(&標準入力にする)
このディスクリプタが開いている限り、ファイル名がなくなっても
ファイルの実体は消えない。
2. (...)
サブシェルを起動する。ファイルディスクリプタは継承される。
3. rm hoge.dat
hoge.datというディレクトリエントリ(ファイル名)を消す。
しかし、それが指していた実体は1.のディスクリプタからまだ参照
されているため、消えない。
4. >hoge.dat
別途hoge.dat という名前でファイルを開く。(&標準出力にする)
これは、もとのhoge.datが指していた実体とは別のディスク領域に書かれる。
5. 全体が終了すると、ファイルディスクリプタが閉じ、もとのファイル実体
が使っていたディスク領域が未使用状態とみなされる。
>>719 (...)じゃなくて{...;}じゃダメ?
最近のシェルは`test`や`[`が組み込みコマンドになってるとのことで
確かにpowerpc-apple-darwin8.0のbash 2.05b.0(1)-releaseでは`builtin`で呼び出せることも確認しました
一方で/bin/[や/bin/testも存在し、当然実行可能でした
また、若干の差異はありますが、複合コマンド(compound command)の`[[ expression ]]`もほぼ同じ用途に利用できます
そこで質問なんですが、少し上で話されていたような処理の重さ(無駄なプロセスの生成等)を考えた場合、
どれを使うのがベストなんでしょう?
当然内部コマンドでしょう。
つーか、パフォーマンス重視な場合は
シェルスクリプトなんか使うな。