Hai, saya ingin menambahkan teks ke file. Misalnya saya ingin menambahkan tugas ke awal file todo.txt. Saya sadar echo 'task goes here' >> todo.txt
tetapi itu menambahkan baris ke akhir file (bukan yang saya inginkan).
Hai, saya ingin menambahkan teks ke file. Misalnya saya ingin menambahkan tugas ke awal file todo.txt. Saya sadar echo 'task goes here' >> todo.txt
tetapi itu menambahkan baris ke akhir file (bukan yang saya inginkan).
Jawaban:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
atau
sed -i '1s/^/task goes here\n/' todo.txt
atau
sed -i '1itask goes here' todo.txt
|
) pesan ( echo '...'
) cat
yang menggunakan -
(input standar) sebagai file pertama dan todo.txt
sebagai yang kedua. cat
buat beberapa file. Kirim output ( >
) ke file bernama temp
. Jika tidak ada kesalahan ( &&
) sejak cat
saat itu ganti nama ( mv
) temp
file kembali ke file asli ( todo.txt
).
cat
menerima backslash n literal, itu tidak akan mengubahnya menjadi baris baru. Sesuatu yang lain pasti telah melakukan itu. Alih-alih cat
, coba pilih hexdump -C
apakah Anda benar-benar mengirim backslash dan n atau apakah itu baris baru. Anda juga dapat mencoba cat -e
menampilkan akhiran garis.
1
melakukan perintah berikutnya hanya pada baris satu file dan i
perintahnya adalah menyisipkan. Lihat di halaman manual di bawah bagian "Alamat" dan di bagian "Perintah nol atau satu alamat".
Pilihan yang lebih sederhana menurut saya adalah:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Ini berfungsi karena perintah di dalam $(...)
dieksekusi sebelum todo.txt
ditimpa dengan> todo.txt
Sementara jawaban lain berfungsi dengan baik, saya menemukan ini jauh lebih mudah diingat karena saya menggunakan gema dan kucing setiap hari.
EDIT: Solusi ini adalah ide yang sangat buruk jika ada backslash todo.txt
, karena berkat -e
flag echo akan menafsirkannya. Cara lain yang jauh lebih mudah untuk memasukkan baris baru ke dalam kata pengantar adalah ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... cukup menggunakan baris baru. Tentu, itu bukan satu-liner lagi, tetapi secara realistis itu bukan satu-liner sebelumnya, juga. Jika Anda melakukan ini di dalam skrip, dan khawatir tentang indentasi (misalnya Anda menjalankan ini di dalam suatu fungsi) ada beberapa solusi untuk membuat ini tetap pas, termasuk tetapi tidak terbatas pada:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
Juga, jika Anda peduli apakah baris baru akan ditambahkan ke akhir todo.txt
, jangan gunakan ini. Ya, kecuali yang kedua ke terakhir. Itu tidak mengacaukan akhirnya.
-e
juga mengonversi urutan pelarian di dalam todo.txt?
The moreutils
memiliki alat yang bagus disebut sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
Ini akan "menyerap" STDIN dan kemudian menulis ke file, yang berarti Anda tidak perlu khawatir tentang file sementara dan memindahkannya.
Anda dapat moreutils
menggunakan banyak distro Linux, melalui apt-get install moreutils
, atau pada OS X menggunakan Homebrew , dengan brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
Anda dapat menggunakan Vim dalam mode Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
pilih baris pertama
i
memasukkan
x
Simpan dan tutup
Anda dapat membuat file sementara yang baru.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Anda mungkin juga menggunakan sed
atau awk
. Tetapi pada dasarnya hal yang sama terjadi.
new_todo.txt
hanya ditulis sebagian. Solusi Anda tampaknya kehilangan file asli.
rm
dari file asli.
Jika file teks cukup kecil untuk muat dalam memori, Anda tidak perlu membuat file sementara untuk menggantinya. Anda dapat memuat semuanya ke dalam memori dan menuliskannya kembali ke file.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Tidak mungkin menambahkan baris ke awal file tanpa harus menulis seluruh file.
text=$(cat file)
. Berhati-hatilah untuk hanya menggunakan teks, karena variabel shell bukan biner bersih mywiki.wooledge.org/BashFAQ/058
Anda tidak dapat menyisipkan konten di awal file. Satu-satunya hal yang dapat Anda lakukan adalah mengganti konten yang ada atau menambahkan byte setelah akhir file saat ini.
Solusi apa pun untuk pertanyaan Anda kemudian membutuhkan file sementara (atau buffer) yang akan dibuat (pada memori atau pada disk) yang pada akhirnya akan menimpa file asli.
Waspadalah jangan sampai kehilangan data dengan menyimpan file asli saat membuat yang baru, jika sistem file terjadi penuh selama proses. misalnya:
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'
berfungsi tetapi cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
memberikan kesalahan "gema: Tidak ada file atau direktori"
<
dan (
akan memecah sintaks. Cobacat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Anda bisa menggunakan tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
Ini adalah versi yang memungkinkan Anda menggunakan string multi-line .
##############################################
## 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]