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等の実行環境が無いような場合でも可能な方法をお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/03/08 13:53:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

今どきの 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"

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

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

id:shinp

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

2013/03/08 13:57:08
id:a-kuma3

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

2013/03/08 14:19:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません