Bir dosyaya birden çok satır ekleme


301

Varsa, bir dosyayı aramak için bir bash betiği yazıyorum, sonra onu oluşturun ve bunu ekleyin:

Host localhost
    ForwardAgent yes

Bu yüzden "line then new line 'tab' then text"hassas bir format olduğunu düşünüyorum. Bunu yapabileceğini biliyorum:

cat temp.txt >> data.txt

Ancak iki satırından beri garip görünüyor. Bunu bu formatta eklemenin bir yolu var mı:

echo "hello" >> greetings.txt

Yanıtlar:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

Dosyaya yazmak için sudo (diğer kullanıcı yetkileri) gerekiyorsa, bunu kullanın:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@The Legend Buna "burada belge" denir. Man sayfasındaki paragrafa bir göz atın.
Hauke ​​Laging

1
Bir olasılık daha var ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--

2
@ ott-- Gerçek bir deniz kabuğuna ihtiyacınız yok (yani yeni bir işlemi kurtarabilir), bu yeterli:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging

2
EOT ve EOL arasındaki fark nedir?
cikatomo

15
Gelen @cikatomo sadece rastgele dizedir. Olabilir de. cat <<EOTEOTcat <<FOO
Hauke,

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Veya, istediğiniz gerçek bir sekme ise (sorunuzdaki dört boşluktan ziyade):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Aynı etkiyi echoancak uygulamadan uygulamaya nasıl değişse de aynı şekilde yapabilirsiniz printf.



16

Başka bir yaklaşım kullanmaktır tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

tee'Nin man sayfasından birkaç seçenek satır :

Tee yardımcı programı standart girişi standart çıktıya kopyalar ve kopyayı sıfır veya daha fazla dosyada oluşturur.

-a - Çıktıyı üzerine yazmak yerine dosyalara ekleyin.


6

SED, böyle bir dosyanın sonuna bir satır ekleyebilir:

sed -i '$ a text to be inserted' fileName.file
$dosyanın sonunu seçer, aeklenmesini söyler ve bundan sonra eklenecek olan metin gelir. Sonra tabii ki dosya adı.


Kaynak: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========= EDIT == ==========

Bu yaklaşımın diğer çözümlerden daha fazla bir faydası var mı?
Evet, bu yaklaşım, aşağıdaki gibi bir aramada döndürülen dosyalara ekleme avantajı sağlar: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

Yukarıdaki örneği, her html sayfasında eksik olan bitiş html etiketini birkaç dizin içine yerleştirmek için kullandım.

===================================


1
Bir dosyaya birden çok satır eklemek için sözdizimini gösterirseniz, bu sorunun cevabı olur (çok kullanışlı olmasa da). Diğer tüm cevaplar basitçe yeni metni yazın. Bu cevap tüm dosyayı okur ve yeniden yazar, ayrıca eklenen metni. Bu yaklaşımın diğerlerine göre herhangi bir faydası var mı?
G-Man

Bu sadece GNU ile çalışır sed. BSD sedhata ile kefil oldu: command a expects \ followed by text. Bu yüzden komut dosyası için bir çözüm kullanmayın; kırmakla yükümlüdür. (Veya BSD gerekli sözdiziminin POSIX uyumlu olduğundan ve GNU üzerinde de çalışacağından, doğru şekilde yapın sed.
Wildcard

Diğer cevaplar ile kullanılabilir findşöyle: find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man

1
Akış yönlendirmesi ( >, >>) olmadığı ve bu nedenle koşu gibi problemlerinden sıkıntı çekmeyen bu çok iyi bir çözümdür sudo echo 'something' > /file. Benim için mükemmel böyle LXD kapta bir dosyaya bir satır eklemek sağlar: lxc exec c sed -- '$ a newline' /myfile.
Draco Ater

echo "a new line" >> foo.fileDosyası yeni hattın bitmez, ancak yeni bir satır oluşturmaz sed -i '$ a a new line' foo.fileböylece yapacağız sedözellikle her zaman dosyaya yeni bir satır eklemek istediğiniz iyidir.
zhouji 12:16

1

Sed kullandım çünkü sudo ile kullanılabiliyor. Örneğin:

sudo sed -i '$ a text to be inserted' fileName.file 

alternatif çok çirkin gibidir:

sudo bash -c "echo a text to be inserted >> fileName.file"  

ve hatta ssh ile bitince çirkin.


1
Bu cevap neden indirildi? Bu ihtiyacım olan çözüme benziyor. Bunda herhangi bir sorun var mı? Olmazsa, onu kullanıp yükselteceğim.
MountainX

Senin mu sed -iargüman olarak bir uzantısı almaz? Örneğinizde yanlış parametreler olabilir.
protometa,

1

Başka bir astar:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Daha -efazla kontrol verdiği için seçenek düşüncesini tercih ederim :

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

1

Kişi cat >> out.txtaynı etkiyi elde etmek için Perl veya Python ile öykünebilir . Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

Ve Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Python için Ctrl+ Dtuşuna iki kez basmanız gerektiğini unutmayın . Daha fazla bilgi için stackoverflow ile ilgili soruya bakın .


1

Bir dosyaya birden çok satır eklemek için örnek:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

Ana cevaba ek olarak, dosyanın süper kullanıcı izinlerine ihtiyaç duyması durumunda, sadece sudoönünde eklemek echoişe yaramaz.

Bunun nedeni, kabuğun komutları çiğnemesi ve buna rağmen echoroot olarak çalıştırılmış olması ancak >>normal ayrıcalıklarla koşmasıdır.

Bu süper kullanıcı için işe yarayacak: sudo su -c "echo 'Line 3' >> greetings.txt"


Buraya ihtiyacınız suyok ( sudo suiyi değil). Fakat haklısın, bir şeylere ihtiyacın var, kabuk yönlendirmesini yönetir; belki sudo sh -c "echo stuff >> file.txt". Net tasarruf yok ama daha iyi bir uygulama.
roaima
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.