人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

bashに詳しい方へ質問いたします。
bashにてsed等のコマンドを用いてテキストファイルの置換を行うことが良くあります。
具体的には
$cat text.txt|sed 's/hoge/fuga/g' > replaced.txt
のように実行しているのですが、上記コマンドでは、必ず「元のファイルと別のファイルを指定しなくてはならない」という問題があります。
これを、
$cat text.txt|sed 's/hoge/fuga/g' > text.txt
のような形で、元のファイルと同じ名前で内容だけ置換するためには、どのようなワンライナーを使用すれば良いでしょうか。
検索するとperlやrubyなどを使用するものが出てきますが、特にperl,ruby,php等の実行環境が無いような場合でも可能な方法をお願いいたします。


●質問者: shinp
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●100ポイント ベストアンサー

今どきの Linux に入ってる sed だと -i オプションがあるんじゃないかと思います。
http://linux.die.net/man/1/sed

もし、それが使えるなら、こんな感じ。

$ sed -i -e 's/hoge/fuga/g' text.txt

昔の sed でも大丈夫にするなら、こんな感じ?

$ sh "f=text.txt; t=/tmp/@@@@; sed -i -e 's/hoge/fuga/g' $f > $t; mv $t $f"

二回ファイル名を打った方が短いですね (^^ゞ

短いスクリプトを書いて、それを使うって感じでしょうか。
位置パラメータの扱いとか、微妙にめんどくさい感じはしますが...


shinpさんのコメント
ありがとうございます! 一応、sed以外にもテキスト編集系のコマンドを使用するので、後半の答えが大変参考になりました。 別名でとりあえず出力しちゃった後に、mvでファイル置換しちゃえば良いのですね! 既に別のファイルがあったらエラー出るんじゃないのかと思ってたら、既存のファイル名にしたらそのまま内容を入れ替えてくれる(つまり、元の別名ファイルは消えてくれる)ようでした。 素早い解答ありがとうございました!

a-kuma3さんのコメント
ワーク用のファイルを作る方法を採用するなら、mktemp コマンドを使ってファイル名を生成した方が安全です(複数人で同時に使う場合、など)。 http://linuxjm.sourceforge.jp/html/GNU_coreutils/man1/mktemp.1.html
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ