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等の実行環境が無いような場合でも可能な方法をお願いいたします。
今どきの 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"
二回ファイル名を打った方が短いですね (^^ゞ
短いスクリプトを書いて、それを使うって感じでしょうか。
位置パラメータの扱いとか、微妙にめんどくさい感じはしますが...
ありがとうございます!
2013/03/08 13:57:08一応、sed以外にもテキスト編集系のコマンドを使用するので、後半の答えが大変参考になりました。
別名でとりあえず出力しちゃった後に、mvでファイル置換しちゃえば良いのですね!
既に別のファイルがあったらエラー出るんじゃないのかと思ってたら、既存のファイル名にしたらそのまま内容を入れ替えてくれる(つまり、元の別名ファイルは消えてくれる)ようでした。
素早い解答ありがとうございました!
ワーク用のファイルを作る方法を採用するなら、mktemp コマンドを使ってファイル名を生成した方が安全です(複数人で同時に使う場合、など)。
2013/03/08 14:19:35http://linuxjm.sourceforge.jp/html/GNU_coreutils/man1/mktemp.1.html