こんにちは、私はファイルにテキストを追加したいです。例えば、todo.txtファイルの先頭にタスクを追加したいと思います。私はecho 'task goes here' >> todo.txt
を意識していますが、それはファイルの最後に行を追加します(私が望むものではありません)
334 user479534 2011-02-17
Linux :
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
or
sed -i '1s/^/task goes here\n/' todo.txt
or
sed -i '1itask goes here' todo.txt
Mac os x
sed -i '.bak' '1s/^/task goes here\'$'\n/g' todo.txt
or
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
or
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
438 Paused until further notice. 2011-02-17
私の考えでは、よりシンプルなオプションは
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
これは、$(...)
の中のコマンドがtodo.txt
が> todo.txt
で上書きされる前に実行されるからです
他の回答でも問題ないのですが、私は毎日エコーと猫を使っているので、こちらの方が覚えやすいと思います
EDIT: todo.txt
にバックスラッシュがある場合、この解決策は非常によくありません。他にも、前置き文字列に改行を入れるよりもはるかに簡単な方法があります
echo "task goes here
$(cat todo.txt)" > todo.txt
…単に改行を使うだけだ確かに、これはもう一行ではありませんが、現実的には以前は一行ではありませんでした。スクリプトの中でこれを実行していて、インデントが気になる場合 (関数の中で実行している場合など)、以下のような回避策がありますが、これに限定されません
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
あと、todo.txt
の最後に改行が入るかどうかが気になるなら、これらを使うな。まあ、2番目から最後のものを除いて。これでは最後まで台無しになりません
86 John Alberts 2012-12-19
moreutils
にはsponge
という素敵なツールがあります
echo "task goes here" | cat - todo.txt | sponge todo.txt
STDINを「吸い上げて」書き込みをしてくれるので、テンポラリファイルや移動の心配がありません
moreutils
は多くのLinuxディストロでapt-get install moreutils
を介して、あるいはOS XではHomebrewを使って、brew install moreutils
を使ってmoreutils
を取得することができます
30 slhck 2013-04-22
POSIXツールex
を使用することができます
ex a.txt <<eof
1 insert
Sunday
.
xit
eof
16 Steven Penny 2016-04-11
新規で一時的なファイルを作成することができます
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
sed
やawk
を使ってもいいかもしれません。しかし、基本的には同じことが言えます
5 Keith 2011-02-17
テキストファイルがメモリに収まるほど小さい場合は、それを差し替えるための一時ファイルを作る必要はありません。メモリに全部読み込んで、ファイルに書き出せばいいのです
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
ファイル全体を書きすぎずにファイルの先頭に行を追加することは不可能です
3 Rucent88 2013-01-09
tee
を使用することができます
echo 'task goes here' | cat - todo.txt | tee todo.txt
3 Radu Rădeanu 2014-07-08
ファイルの先頭にコンテンツを挿入することはできません。できることは、既存のコンテンツを置き換えるか、ファイルの現在の終わりの後にバイトを追加することだけです
ご質問の解決策としては、一時的なファイル(またはバッファ)を作成する必要があります(メモリ上またはディスク上)
新しいファイルを作成している間に元のファイルを保存してデータを失わないように注意してください
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
3 jlliagre 2011-02-17
GitBash + Windows10 + Multline
複数行の文字列を使えるようにするバージョンです
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]
0 J MADISON 2018-08-04
Final answer
cat <<< "prepended text
$(cat test.txt)" > test.txt
Context
私は、回答がタイプしすぎているように感じたので、あまり満足していませんでした。私はJohn Albertsの答えが好きだったのですが、-e
をタイプするのに耐えられませんでした。残念なことに、私はジョン・アルバーツのecho
の2つのライナーを誤って読んでしまいました(この回答の価値を大幅に下げてしまい、私は30分も遊んでいましたが、まあ、それはそれで仕方がありません)
いずれにしても、前置きしたいファイル名とテキストを入力するだけでいいという意味のものを見つけることに集中していました
さらに、私は美的に直感的に見えるものを探していました。プリプレンドは物理的に表示する必要があります たとえそれが錯覚であっても それはニーモニックの効果を持っています
そこで、ヘレストリングスを使ったアプローチを試してみました
test.txt
というファイルを"monkeys"
という言葉で作成しました
そして、私はタイプしました
cat <<< "prepend
> $(< test.txt)"
Output:
prepend
monkeys
少し分かりやすく
自分で手動でenter
を押す必要があります
2 行目の >
はシェル自体のものなので、これを入力する必要はありません
Notes:
(1)なんとかならなかったのはワンライナー。$()
と\n
が使えるようなヘイストリングの組み合わせはないようです。だから自分で手動で改行を押さないといけない
(2) $(< test.txt)
は$(cat test.txt)
と同じ効果があります。バッシュリファレンスマニュアルにはこう書かれています
コマンド置換
$(cat file)
は、同等ではあるがより高速な$(< file)
に置き換えることができます
ということは、あなたもできるということですね
cat <<< "prepend
> $(cat test.txt)"
タイピングは多めだが、cat
が2回タイピングされていて、Bashリファレンスマニュアルのトリックよりもよく知られているので、認知的には少し負担が少ないのは認める
0 Melvin Roest 2020-03-15