web-dev-qa-db-ja.com

Bashのファイルの先頭にテキストを追加する方法

こんにちは私はファイルの前にテキストを追加したいです。たとえば、todo.txtファイルの先頭にタスクを追加します。私はecho 'task goes here' >> todo.txtを知っていますが、それはファイルの終わりに行を追加します(私が欲しいものではありません)。

270
user479534
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
359

私の考えではもっと簡単なオプションは:

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番目のものを除いてそうです。それは終わりを台無しにしません。

68
John Alberts

moreutils にはspongeというNiceツールがあります。

echo "task goes here" | cat - todo.txt | sponge todo.txt

STDINを「吸収」させてからファイルに書き込むので、一時ファイルやそれらの移動について心配する必要はありません。

あなたはapt-get install moreutilsを通して、あるいはbrew install moreutilsと共に Homebrew を使って、多くのLinuxディストリビューションでmoreutilsを得ることができます。

28
slhck

ExモードでVimを使うことができます。

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1最初の行を選択

  2. i挿入

  3. x保存して閉じる

8
Steven Penny

新しい一時ファイルを作成できます。

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt

sedawkを使うこともできます。しかし、基本的に同じことが起こります。

5
Keith

テキストファイルがメモリに収まるほど小さい場合は、一時ファイルを作成して置き換える必要はありません。それをすべてメモリにロードしてファイルに書き戻すことができます。

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

ファイル全体を上書きせずにファイルの先頭に行を追加することは不可能です。

3
Rucent88

ファイルの先頭にコンテンツを挿入することはできません。できることは、既存のコンテンツを置き換えるか、現在のファイルの終わりの後にバイトを追加することだけです。

あなたの質問に対するどんな解決策でもその後一時的なファイル(またはバッファ)を作成する必要があり(メモリ上またはディスク上に)、最終的に元のファイルを上書きします。

プロセス中にファイルシステムがいっぱいになっても、新しいファイルを作成するときに元のファイルを保持してデータを失うことがないように注意してください。例えば:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
2
jlliagre

teeを使うことができます:

echo 'task goes here' | cat - todo.txt | tee todo.txt
1
Radu Rădeanu

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]
0
J MADISON