2012-02-21 7 views
1

私はlinuxでbashを使ってファイルの先頭にコンテンツを追加しています。 これまで私は、一時ファイルを使用してこれを行うことができることを知っています。そう 私はそれをこのようにやっている:StdOutをファイルの最上部に追加するにはどうしたらいいですか?

tac lines.bar > lines.foo 
echo "a" >> lines.foo 
tac lines.foo > lines.bar 

をしかし、第二のファイルを記述することなく、これを行うための良い方法はありますか?

答えて

2
echo a | cat - file1 > file2 

shellterの

と同じ1行にsedのに役立ちます願っています。

sed -i -e '1 i<whatever>' file1 

これは、ファイル1の場所に挿入されます。 sedと場所を交換に名前付きパイプを使用して the sed example i referred to

+0

これはまさに私が必要としていたものです。 – l1zard

0

tacは、特に2倍にする必要があるため、非常に高価なソリューションです。それでもtmpファイルを使用する必要があるが、これはあまり時間がかかります。ノートあたり

編集をKeithThompsonから、今使用してファイル名とcondtional /bin/mv「$$」。

{ 
    echo "a" 
    cat file1 
    } > file1.$$ && /bin/mv file1.$$ file1 

は、私は、これは

+1

私はたぶん '(echo" a "; cat file1)> file1。$$ && mv file1。$$ file1'と書いています。 '。$$'接尾辞は既存のファイルを壊すのを避け、 '&&'はコマンドが失敗した場合に 'file'を壊すのを防ぎます。 –

+0

優れたアップグレード、ありがとう。私はまだ '{}'プロセスグループがより効率的であると信じたいと思いますが、実際には私はいつもサブプロセスがこのようなもののために生成されているのを見ています。 – shellter

0

は、明示的に一時ファイル必要とせずに、ファイルの先頭にコマンドの出力を追加することができます。

mkfifo output 
your_command >> output & 
sed -i -e '1x' -e '1routput' -e '1d' -e '2{H;x}' file 
rm output 

何をこれは、your_commandの出力を名前付きパイプ(fifo)にバッファリングし、この出力にrコマンドsedを使用しての場所にを挿入します。そのためには、fifoの出力をブロックしないように、バックグラウンドでyour_commandを開始する必要があります。

rコマンドは、サイクルの最後にファイルを出力するので、2行目で出力するために、1行目のファイルをホールドスペースにバッファリングする必要があります。

私はを明示的に必要とせずに書きます。として、sedはそれ自身のために1つを使用する可能性があります。

関連する問題