こんにちは私はファイルの前にテキストを追加したいです。たとえば、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 -e "task goes here\n$(cat todo.txt)" > todo.txt
これは、$(...)
内のコマンドがtodo.txt
が> todo.txt
で上書きされる前に実行されるために機能します。
他の答えはうまくいきますが、私は毎日echoとcatを使っているので覚えやすいです。
EDIT:todo.txt
フラグのおかげでエコーがそれらを解釈するので、この解決法は-e
にバックスラッシュがあると非常に悪い考えです。改行を前置き文字列に入れるもう1つの、はるかに簡単な方法は...
echo "task goes here
$(cat todo.txt)" > todo.txt
...単に改行を使うだけです。確かに、それはもうワンライナーではありませんが、現実的には以前もワンライナーではありませんでした。スクリプト内でこれを実行していて、インデントを気にする必要がある場合(たとえば、関数内で実行している場合)、これをうまく合わせるためのいくつかの回避策があります。
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
また、todo.txt
の最後に改行が追加されるかどうかを気にする場合は、これらを使用しないでください。最後から2番目のものを除いてそうです。それは終わりを台無しにしません。
ExモードでVimを使うことができます。
ex -s -c '1i|task goes here' -c x todo.txt
1
最初の行を選択
i
挿入
x
保存して閉じる
新しい一時ファイルを作成できます。
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
sed
やawk
を使うこともできます。しかし、基本的に同じことが起こります。
テキストファイルがメモリに収まるほど小さい場合は、一時ファイルを作成して置き換える必要はありません。それをすべてメモリにロードしてファイルに書き戻すことができます。
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
ファイル全体を上書きせずにファイルの先頭に行を追加することは不可能です。
ファイルの先頭にコンテンツを挿入することはできません。できることは、既存のコンテンツを置き換えるか、現在のファイルの終わりの後にバイトを追加することだけです。
あなたの質問に対するどんな解決策でもその後一時的なファイル(またはバッファ)を作成する必要があり(メモリ上またはディスク上に)、最終的に元のファイルを上書きします。
プロセス中にファイルシステムがいっぱいになっても、新しいファイルを作成するときに元のファイルを保持してデータを失うことがないように注意してください。例えば:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
tee
を使うことができます:
echo 'task goes here' | cat - todo.txt | tee todo.txt
Git Bash + Windows 1 + マルチライン:
複数行文字列を使用できるバージョンです。
##############################################
## 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]