こんにちは、ファイルにテキストを追加します。たとえば、todo.txtファイルの先頭にタスクを追加します。私は知っていますがecho 'task goes here' >> todo.txt
、それはファイルの最後に行を追加します(私が望むものではありません)。
こんにちは、ファイルにテキストを追加します。たとえば、todo.txtファイルの先頭にタスクを追加します。私は知っていますがecho 'task goes here' >> todo.txt
、それはファイルの最後に行を追加します(私が望むものではありません)。
回答:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
または
sed -i '1s/^/task goes here\n/' todo.txt
または
sed -i '1itask goes here' todo.txt
|
するメッセージ(echo '...'
)をパイプ()します。複数のファイルを連結します。出力()をという名前のファイルに送信します。エラーがない場合()から、ファイル名を変更()して元のファイルに戻します()。cat
-
todo.txt
cat
>
temp
&&
cat
mv
temp
todo.txt
cat
なりませんが、文字通りバックスラッシュnを受け取った場合、改行に変換しません。他の何かがそれをしたに違いない。の代わりにcat
、hexdump -C
実際にバックスラッシュとnを送信しているか、それが改行かを確認するためにパイピングしてみてください。cat -e
行末を表示することもできます。
1
ファイルの1行目でのみ次のコマンドを実行し、i
コマンドは挿入されます。「アドレス」セクションの「manページ」と「ゼロまたは1アドレスのコマンド」セクションをご覧ください。
私の意見では、より簡単なオプションは次のとおりです。
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
これは、内部のコマンドが上書き$(...)
される前に実行されるため機能しtodo.txt
ます> todo.txt
他の答えはうまくいきますが、私は毎日echoとcatを使用しているため、これはずっと覚えやすいと思います。
編集:このソリューションは、バックスラッシュがある場合todo.txt
、-e
フラグエコーのおかげでバックスラッシュが解釈されるため、非常に悪い考えです。序文文字列に改行を入れるもう1つのはるかに簡単な方法は...
echo "task goes here
$(cat todo.txt)" > todo.txt
...単に改行を使用します。確かに、これはもう1ライナーではありませんが、現実的には以前は1ライナーではありませんでした。スクリプト内でこれを行っており、インデントが心配な場合(たとえば、関数内でこれを実行している場合)、これをうまくフィットさせるためのいくつかの回避策があります。
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
また、の末尾に改行が追加されるかどうかを気にする場合はtodo.txt
、これらを使用しないでください。まあ、最後から2番目を除いて。それは終わりを台無しにしません。
-e
todo.txt内のエスケープシーケンスも変換しませんか?
moreutils
呼ばれる便利なツールを持っていますsponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
STDINを「吸収」してからファイルに書き込みます。つまり、一時ファイルを心配したり、ファイルを移動したりする必要はありません。
あなたは得ることができmoreutils
て、多くのLinuxディストリビューションをapt-get install moreutils
使用して、またはOS X上で自作して、brew install moreutils
。
(echo 'ble'; cat todo.txt)
:-)
新しい一時ファイルを作成できます。
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
sed
またはを使用することもできますawk
。しかし、基本的に同じことが起こります。
new_todo.txt
部分的にしか書き込まれないとします。ソリューションは元のファイルを失うようです。
rm
は元のファイルのみです。
テキストファイルがメモリに収まるほど小さい場合は、一時ファイルを作成して置き換える必要はありません。すべてをメモリにロードし、ファイルに書き戻すことができます。
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
ファイル全体を上書きせずにファイルの先頭に行を追加することは不可能です。
text=$(cat file)
。ただし、シェル変数はバイナリクリーンではないため、テキストのみを使用するように注意してくださいmywiki.wooledge.org/BashFAQ/058
ファイルの先頭にコンテンツを挿入することはできません。できることは、既存のコンテンツを置き換えるか、現在のファイルの最後にバイトを追加することだけです。
質問に対する解決策は、一時ファイル(またはバッファー)を(メモリ上またはディスク上に)作成し、最終的に元のファイルを上書きする必要があります。
プロセス中にファイルシステムがいっぱいになった場合、新しいファイルを作成するときに元のファイルを保存することでデータを失わないように注意してください。例えば:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
動作しますがcat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
、「エコー:そのようなファイルまたはディレクトリはありません」というエラーが表示されます
<
と(
構文が壊れます。試してくださいcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
以下を使用できますtee
。
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + マルチライン:
これは、複数行の文字列を使用できるバージョンです。
##############################################
## 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]