Bashでファイルの先頭にテキストを追加するには?

bash

こんにちは、私はファイルにテキストを追加したいです。例えば、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
ex

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

sedawkを使ってもいいかもしれません。しかし、基本的には同じことが言えます

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


タイトルとURLをコピーしました