Merhaba, bir dosyaya metin hazırlamak istiyorum. Örneğin, bir todo.txt dosyasının başına görev eklemek istiyorum. Farkındayım echo 'task goes here' >> todo.txt
ama bu dosyayı sonuna kadar ekler (istediğim şeyi değil).
Merhaba, bir dosyaya metin hazırlamak istiyorum. Örneğin, bir todo.txt dosyasının başına görev eklemek istiyorum. Farkındayım echo 'task goes here' >> todo.txt
ama bu dosyayı sonuna kadar ekler (istediğim şeyi değil).
Yanıtlar:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
veya
sed -i '1s/^/task goes here\n/' todo.txt
veya
sed -i '1itask goes here' todo.txt
|
mesajı ( echo '...'
) yönlendirin . conCATenate birden fazla dosya. Output ( ) adlı bir dosyaya gönderin . Hata yoksa ( ), o zaman yeniden adlandırın ( ), dosyayı orijinal dosyaya ( ) geri döndürün . cat
-
todo.txt
cat
>
temp
&&
cat
mv
temp
todo.txt
cat
değişmez bir ters eğik çizgi alırsa, onu yeni bir satıra dönüştürmez. Bunu başka bir şey yapmış olmalı. Bunun yerine, gerçekte ters eğik çizgi gönderip göndermediğinizi veya yeni bir satır olup olmadığını görmek için cat
boruları deneyin hexdump -C
. Ayrıca cat -e
satır sonlarını da göstermeyi deneyebilirsiniz .
1
, bir sonraki komutu yalnızca dosyanın satırında yapar ve komut eklenir i
. "Adresler" bölümünün altındaki ve "Sıfır veya Tek adres komutları" bölümündeki man sayfasına bakın.
Bence daha basit bir seçenek:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Bu çalışır çünkü içindeki komutun üzerine $(...)
çalıştırılır.todo.txt
> todo.txt
Diğer cevaplar iyi çalışırken, hatırlamak çok daha kolay çünkü her gün yankı ve kedi kullanıyorum.
EDIT: Eğer ters eğik çizgi varsa bu çözüm çok kötü bir fikir todo.txt
, çünkü -e
bayrak sayesinde yankı onları yorumlayacak. Yeni satırları önsöz dizgisine eklemenin çok daha kolay bir yolu ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... sadece yeni satırları kullanmak için. Tabii ki, artık bir astar değil, ama gerçekçi olarak, daha önce de bir astar değildi. Bunu bir komut dosyası içinde yapıyorsanız ve girintileme konusunda endişeleniyorsanız (örneğin, bunu bir işlevin içinde yürütüyorsunuz), bunun da dahil olmak ancak bunlarla sınırlı olmamak üzere, güzel bir şekilde sığmaya devam etmesi için birkaç geçici çözüm vardır:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
Ayrıca, yeni bir satırın sonuna eklenip eklenmediğini önemsiyorsanız todo.txt
, bunları kullanmayın. Şey, ikinci-sonuncusu hariç. Bu, sonu karıştırmaz.
-e
da todo.txt içine kaçış dizileri dönüştürmek?
moreutils
Adlı güzel bir araca sahip sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
STDIN'i "ıslatır" ve ardından dosyaya yazılır, bu da geçici dosyalar hakkında endişelenmenize gerek kalmadan dosyaları taşımak zorunda kalmayacağınız anlamına gelir.
Sen alabilirsiniz moreutils
boyunca, pek çok Linux dağıtımlarının ile apt-get install moreutils
kullanarak veya OS X'de Homebrew ile brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-) için giderdim
Vim'i Ex modunda kullanabilirsiniz:
ex -s -c '1i|task goes here' -c x todo.txt
1
ilk satırı seç
i
eklemek
x
kaydet ve kapat
Yeni, geçici bir dosya oluşturabilirsiniz.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Ayrıca sed
veya kullanabilirsiniz awk
. Ama temelde aynı şey olur.
new_todo.txt
sadece kısmen yazılabilir. Çözümünüz orijinal dosyayı kaybediyor.
rm
orijinal dosyaya aittir.
Metin dosyası belleğe sığacak kadar küçükse, onunla değiştirmek için geçici bir dosya oluşturmanız gerekmez. Hepsini hafızaya yükleyebilir ve dosyaya geri yazabilirsiniz.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Dosyanın tamamına yazı yazmadan satır başına satır eklemek mümkün değildir.
text=$(cat file)
. Kabuk değişkenleri değil ikili temiz olduğundan olsa tek kullanım metne dikkat mywiki.wooledge.org/BashFAQ/058
Dosyanın başına içerik ekleyemezsiniz. Yapabileceğiniz tek şey, mevcut içeriğin yerini almak veya dosyanın sonundan sonra bayt eklemek.
Sorunuzla ilgili herhangi bir çözüm, sonunda özgün dosyanın üzerine yazacak (bellekte veya diskte) geçici bir dosya (veya arabellek) oluşturulmasını gerektirir.
Yeni dosya oluşturulurken orijinal dosyayı koruyarak veri kaybetmemeye dikkat edin, dosya sistemi işlem sırasında tamamen doluysa. Örneğin:
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'
çalışır ancak cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
"echo: Böyle bir dosya veya dizin yok" hatası veriyor
<
ve (
sözdizimi kırar. Deneyincat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Kullanabilirsiniz tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows 10 + multline :
Çok satırlı dizeleri kullanmanızı sağlayan bir sürüm .
##############################################
## 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]