Cat komutundaki bir dosyaya satır mı ekliyorsunuz?


12

cat file.txtBir dosyanın içeriğini almak için yapabilirim ama aynı zamanda kendi seçtiğim bir son satırda mücadele etmek istiyorum.

Boruları denedim (cat file.txt ; echo "My final line") |ama sadece son hat borudan geçiyor. Kediye ve son hatta nasıl katılabilirim?

Bir açıklama noktası için düzenleyin: Dosyanın kendisini değiştirmek istemiyorum. Eğer yapabilirsem bu olsaydı echo "My final line" >> file.txtya da echo "My final line" | tee -a file.txtben sadece bu özel komut bağlamında eki yapmaya çalışıyorum ve böylece birleştirme file.txtve boru olabilir farkındayım "My final line".


1
Belki bir şey echo "My final line" >> file.txt?
edwinksl

Aslında komut sadece komut / piping dosya nesnesine eklemek istemiyorum. >>Dosyanın kendisini düzenlemek istersem satırı ekleyebileceğimi zaten biliyorum .
DoubleBass

11
Yanlışlıkla sildiniz file.txtmi? Boru pasajınız çalışmalıdır.
Bracken

@DoubleBass: Mathieu Mitchell'in yanıtı, dosyayı değiştirmediğinden (bellekte veya diskte) daha iyi bir yanıttır, ancak bunun yerine yerleşik bir komutun bir özelliğini kullanır.
Bryan Boettcher

Yanıtlar:


30

Bunu catelde etmek için birden fazla dosyayı okuma yeteneği ile birlikte stdin'den okuma yeteneğinden yararlanabilirsiniz.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Ayrıca bir satırı da başlatabilirsiniz:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Tek bir satırla sınırlı olmadığınızı unutmayın. catstdin'den EOF'a ulaşana kadar okuyacaktır. Çıktıyı curlörneğin çıktısının başına veya sonuna eklemek için iletebilirsiniz cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>

1
(cat file.txt ; echo "My final line") | …yapardı. Ancak catbunun için tasarlanmış olanı kullanmak daha iyi +1.
ctrl-alt-delor

@ ctrl-alt-delor: Alt kabuklar ayrıca çatal için nispeten pahalı olan ek bir işlemin dezavantajına sahiptir. Örneğin, echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs. ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cathatta deneyin { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster

12

Bir dosyaya bir satır ekleyerek için, sadece, kabuk ekleme yönlendirme operatörünü kullanabilirsiniz >>(dosya edilecek open(2)olan -ed O_APPENDbayrak):

echo 'My final line' >>file.txt

Şimdi, sadece son satır eklenmiş olan dosyanın içeriğini görüntülemek istiyorsanız cat, iki argümanla birlikte kullanacağım :

  • İlk olarak, dosyanız açık bir şekilde, diyelim file.txt
  • İkinci argüman seçtiğiniz dizedir ve dizeyi bir dosya adı olarak iletmek için ( catyalnızca dosyalarla ilgilenir gibi ) <()bir dosya tanımlayıcı () döndüren işlem ikamesinden yararlanabilirsiniz /proc/self/fd/<fd_number>).

Bunları bir araya getirmek:

cat file.txt <(echo 'My final line')

Çıktının sayfalanmasını istiyorsanız, lessen sevdiğiniz çağrı cihazı olduğunu varsayarsak :

less file.txt <(echo 'My final line')

<()bash için çalışıyor, ama başka hangi mermiler için çalışıyor? Ksh? Dash?
jpaugh

1
@jpaugh ksh, zsh- Evet, dash- Hayır.
heemayl

Bu orijinali değiştirir.
ctrl-alt-delor

11
sed -e '$aMy final line' file.txt

Gönderen man sedseçeneği-e

-e script, --expression=script
    add the script to the commands to be executed

$son satırla eşleşir ve adizeyi ekler.

Satırı dosyaya kalıcı olarak eklemek istiyorsanız, -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Komutu olarak değiştirmek

sed -i -e '$aMy final line' file.txt

1
Tek tırnak kullanın ve ters eğik çizgiye ihtiyacınız yok.
Joker

7

Sorunun yorumlarında zaten açıklığa kavuşturuldu, ancak tekrar burada bir cevap olarak eklendi.

Soruda belirtilen komut,

(cat file.txt ; echo "My final line") | other command

beklendiği gibi çalışır - parantezler tarafından oluşturulan alt kabuktan tüm çıktılar ikinci komuta bağlanır.

Dosya yeni bir satırla bitmezse, yankı dizesi son satıra eklenir - bu, buradaki diğer tüm çözümlerle ortaktır ve daha önce başka (boş) bir yankı ekleyerek çözülebilir.


1
Dosya bir satır ile bitmiyor, ben kullanırım awk: awk 1 file.txt; echo "My final line". awk 1 filedosyanın sonunda EOL eksikliğini telafi etmek için güzel bir numara.
muru

Dosya yeni bir satırla echo "\nMy final line"awk
bitmezse
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.