Bir dosyaya nasıl metin eklerim?


109

Linux'ta bir dosyaya metin eklemenin en kolay yolu nedir?

Bu soruya bir göz attım , ancak kabul edilen cevap ek bir program kullanıyor ( sed) Eminim daha kolay bir yol echoveya benzeri olmalıdır.

Yanıtlar:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Esasen, istediğiniz herhangi bir metni dosyaya dökebilirsiniz. CTRL-D, girişi sonlandıran ve sizi kabuğa geri döndüren bir dosya sonu sinyali gönderir.


2
Dosya kök iznine ihtiyaç duyduğunda bunu nasıl yapabilirim?
YararsızCat

2
@UselesssCat bir şey "izin reddedildi" olduğunda, çalıştırdığım komutu yeniden kontrol ediyorum ve sonra kullanıyorum sudo !!- bu, son komutu sudobaşa eklenmiş olarak çalıştırıyor . Geçenlerde bunun nanoetc ile de çalıştığını öğrendim (yanlışlıkla nano nano auth...)
Sandra

sudo kullanmanız veya bunu bir komut dosyasında kullanmanız gerekiyorsa, aşağıdaki kabul edilen bu yanıtı takip etmeme bakın.
user12345

4
Kedinin bu şekilde kullanılabileceğini bilmiyordum! Günlük girişi yazmak gibi. Ayrıca ctrl-d'nin ne yaptığını bilmiyordum. Teşekkür ederim!
houallet

1
@Sandra - Daha !!önce kullanmadım , harika. Sık sık böyle şeyler yapıyorum cat /var/log/apache/error.logve izin verilmiyor. Bu aynı zamanda geçmişten bir id ile de yapılabilir, örneğin sudo !1419bu, komutu 1419sudo olarak geçmişte satırda çalıştıracaktır .
Cyclonecode

172

Peki ya:

echo "hello" >> <filename>

Kullanılması >>kullanırken, dosyanın sonuna veri ekler operatörü >mevcut ise dosyanın içeriğini üzerine yazacaktır.

printfAynı şekilde de kullanabilirsiniz :

printf "hello" >> <filename>

Yukarıdakileri kullanmanın tehlikeli olabileceğini unutmayın. Örneğin, halihazırda bir dosyanız varsa ve dosyanın sonuna veri eklemeniz gerekiyorsa ve dosyadaki son >tüm verileri eklemeyi unutursanız , dosyadaki tüm veriler yok edilir. Bu davranışı, noclobberdeğişkeni aşağıdaki şekilde ayarlayarak değiştirebilirsiniz .bashrc:

set -o noclobber

Şimdi yapmaya çalıştığınızda echo "hello" > file.txtbir uyarı mesajı alacaksınız cannot overwrite existing file.

Dosyaya yazmaya zorlamak için şimdi özel sözdizimini kullanmanız gerekir:

echo "hello" >| <filename>

Ayrıca, varsayılan echoolarak, -nbayrak kullanılarak bastırılabilecek bir sondaki yeni satır karakteri eklediğini de bilmelisiniz :

echo -n "hello" >> <filename>

Referanslar


4
Genel olarak, bunu kabul edilen cevaptan daha çok seviyorum cat, ancak >>bunun yerine kullanmaya dikkat etsen iyi olur >!
altmış4bit

@ sixty4bit - Tamamen katılıyorum, ancak bir kabukla çalışırken ne yaptığınızı her zaman bilmelisiniz, yoksa şöyle bir şey yapabilirsiniz sudo rm -r /=)
Cyclonecode

1
Daha iyi sudo rm -r /daha sudo rm -rf /! ^ _ ^ İle mevcut bir dosyanın içeriğinin üzerine yazmadan önce onay isteyecek bir işaret var mı >? Bunu her zaman böyle bir bayrağı kullanmak için takma ad, iyi bir fikir gibi görünüyor.
altmış4bit

2
@ sixty4bit - ekleyebilir set -o noclobbersenin içinde .bashrcözel bir sözdizimi kullanmadan sonra varolan bir dosyanın üzerine edemezecho "hello" >| <filename>
Cyclonecode

dosyanın çağrıldığı bir örnek verebilir misiniz, "myFile.txt" veya başka bir şey diyebilir misiniz?
Örneğinizde

24

Diğer olası yol şudur:

echo "text" | tee -a filename >/dev/null

-aDosyanın sonuna ekler.

Gerekirse sudokullanın:

echo "text" | sudo tee -a filename >/dev/null

Neden sonunda> / dev / null?
Quadrivium

1
>/dev/nullUç önler "metin" adresinden konsolda gösterilebilir.
user9869932

13

Kabul edilen cevaba kadar takip edin.

Bunu bir komut dosyasında kullanıyorsanız sonu belirlemek için CTRL-D dışında bir şeye ihtiyacınız vardır . Bunun yerine şunu deneyin:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Bu, belirtilen dosyaya metin ekleyecektir ("EOF" dahil değil).

Bu bir kullanır burada belgeyi (veya bir yorumlu metin) .

Bununla birlikte, belirtilen dosyaya eklemek için sudo'ya ihtiyacınız varsa, doğrudan komut satırına yazıyorsanız, G / Ç yeniden yönlendirmesi nedeniyle bir yorum yazarken sorun yaşarsınız.

Bu varyasyon, doğrudan komut satırına yazarken çalışacaktır:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Veya teebunun yerine, heredocu cat ile kullanırken görülen komut satırı sudo sorununu önlemek için kullanabilirsiniz :

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

Yıllardır kullanıyorum cat << 'EOF' >ve cat << 'EOF' >>eklemeyi bilmiyordum ! Teşekkürler
FreeSoftwareServers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.