Dosyanın ilk satırından önce metin nasıl eklenir?


Yanıtlar:


101

Metni bir önceki satıra sedekleyen 'insert ( i) seçeneğini kullanın .

sed '1 i\

Soru yazarının güncellemesi:

Dosyayı yerinde düzenlemek için - GNU ile sed- Ben -iseçeneği eklemek zorunda kaldım :

sed -i '1 i\anything' file

Ayrıca sözdizimi

sed  -i '1i text' filename

GNU olmayan sed için

Ters eğik çizgiden hemen sonra 1i\ve sonra geri dönüş tuşuna basmanız gerekir first_line_text:

sed -i '1i\
first_line_text
'

Ayrıca, bazı GNU dışı seduygulamaların (örneğin macOS'taki) , bayrak için bir argüman gerektirdiğini unutmayın-i ( -i ''GNU ile aynı etkiyi elde etmek için kullanın sed).


1
-iSeçenek olmadan çalışmaz . Kabul etmeden önce cevabınızı güncelleyeceğim.
Manolo

1
Teşekkürler. Hangi işletim sistemini kullanıyorsunuz? Orijinal çözüm OpenSuse 9'da çalıştı.
şüpheli

1
İlginç! Lubuntu 13.10'dayım ve sed '1 i\this text is entered above the existing first line' filebenim için çalışıyor.

2
Burada, sed (GNU sed) 4.2.2sadece sed '1 i text to insert' -i filebir çekicilik gibi çalıştı. Thanks
ton

1
@FeRD awkAşağıdaki kötü dereceli cevabımı görün . Bu çalışmalı.
rudimeier

18

Yankı metni almak için kullanılır. Cat dosya adı - konsolu dosyayı yazdırır ve> dosyayı başka bir dosya adı1'e göndermek için kullanır ve sonra metni istenen dosya ilk satırına eklemek için dosya adını1 dosya adına taşırız.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename

7
Lütfen aşağıdakilerin neden reddedildiğini bana bildirin
Ankit Shah

1
Belki de OP, sed'den bahsettiği için. Bu benim görüşüme göre aşağı oy hak etmiyor. Bu çözüm benim ihtiyaçlarıma en uygun olanıydı, sonra da oy kullandı.
рüффп

Ben oy kullandım. benim için ksh üzerinde çalışıyor.
arcee123

16

Vim'i Ex modunda kullanabilirsiniz:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 ilk satırı seç

  2. i metin ve newline ekle

  3. x kaydet ve kapat


7

Sen istiyoruz eklemek ilk satırdan önce metin yerine eklemek sonra, bu yüzden kullanmak

sed '1 i\
your_text' your_file

Burada bir belge de yardımcı olabilir:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

GNU awk> = 4.1 kullanarak:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Tüm sedcevapların aksine , bu da boş dosyalarda çalışır.


inplacebir kütüphanedir ve ne yazık ki tüm awk dağıtımlarında görünmektedir. "Awk: fatal: 'inplace' okumak için kaynak dosyasını açamıyorum"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
vossad01

6
sed  -i '1i new_text' file_name

-iSeçeneği belirtmezseniz, herhangi bir hata göstermez ve çıktıyı standart terminalde görüntüler, ancak dosyayı dosyaya yerleştirmez.


Soru, -ianahtarla ilgili değil .
don_crissti

Bunu nasıl anladın? O olduğu sorusuna bir cevap. Evet, kabul edilen cevaba benzer , ancak aynı değildir.
G-Man

@ G-Man - Bir idealden uzak ama gerçekten cas tarafından kullanılan şablonu olduğunu iddia edebilir, bu benzer gibi içinde neredeyse özdeş ... aralık ve bu bir ters eğik çizgi vardır aslında olmanın farkı. Endişelendiğim kadarıyla teknik olarak özdeştiler (her ikisi de gnu sedözel olduğu ve sadece ters eğik çizgiyi gnu sedkabul etmeyecek olan şey olduğu gibi i). Başkaları bunun garanti verdiğini ayrı bir cevap + bir artıracağını düşünürlerse ... peki
don_crissti

2

0aEğer teşebbüs komut mu çalışmak ex, öncülü içinvi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

printfTek başına komutu verir:

0a
Anything you want to add
.
x

0aAracı 0. çizgi sonra (yani, birinci çizgi önce) ekleyin.

Bir sonraki satır veya birden çok satır eklenecek hazır metindir.

.Tek başına bir çizgi "ekleyin" komutunu sonlandırır.

xNedenleri Ex dosyası ve çıkış yapılan değişiklikleri kaydetmek için.


1

Bu eski soruda hiç kimsenin en yaygın (ve bu durumda oldukça basit) sed komutunu göstermediğine şaşırdım:

$ sed  -i '1s/^/new_text\
/' file_name

Hangi kabukları çalışır ve birkaç sed sürümleri için taşınabilir.
GNU sed varsa, bunu kullanabilirsiniz:

$ sed -i '1s/^/new_text\n' file_name

Aradaki fark, GNU sed'in \nbir newline için kullanılmasına izin vermesi ve diğerlerinin ters eğik çizgiden önce gelen (hatta GNU sed'de de çalışan) değişmez bir newline ihtiyacı olması.

$'…'Sözdizimini kabul eden bir kabuk kullanımdaysa, newline'ı doğrudan ekleyebilirsiniz, bu nedenle newline'ın zaten orada olduğunu görür:

$ sed -i $'1s/^/new_text\\\n/' file_name

Hangi daha sed sürümleri için çalışır.


-1

Maalesef, yukarıdaki cevapların çoğu (çoğunlukla ile sed), ilk satırın yerini aldıkları için benim için işe yaramadı. Ben bir Ubuntu 16.04 LTSmakinedeyim. İşte benim geçici çözüm GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name

1
Ne hakkında konuştuğunuzdan emin değilsiniz ... sedDeğişim kullanan yalnızca bir cevap var, ancak mevcut satırın yerini almıyor.
don_crissti

-1

İlk ve son

Bir dosyanın başına / sonuna nasıl metin ekleyeceğinizi / ekleyeceğinizi araştıran birinin muhtemelen diğerinin de nasıl yapılacağını bilmesi gerektiğini varsayardım.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

açıklama

Bu calçıkış , genişletilmiş RegEx ( ) ve 6 "betik" uygulanmış ( ) ve guan- sed( brew.sh gsedaracılığıyla yüklenen macOS'ta ) ve okunabilirlik için kaçan satır sonları ile birlikte çıkış borularıdır . Script 1 ve 2 , "1. satırda, ekle" yi kullanır. Script 5 ve 6 , "<last> satırında, sonda" satırını kullanır . Kodun sonuçta beklenenleri temsil etmesi için metin çıktılarını dikey olarak hizaladım. Script 3 ve 4, ikame yapar (ikincisi sadece "<last>" satırı için geçerlidir). Sonuç, komut çıkışını geçerli JSON'a dönüştürmektir.-E-e\1i\$a\

çıktı

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}

Sorunuza oy vermeme rağmen, istenen sonucu gösteren kabul edilen bir cevap da dahil olmak üzere çok sayıda cevabımız olduğuna dikkat edin.
Jeff Schaller

@JeffSchaller Stack Exchange topluluğu bir forum değil. Amacı OP'nin engellenmesine yardımcı olmanın ötesine geçiyor. Amaç, küresel bilgi tabanını, arayanların cevapları ararken karşılayabilecekleri birçok seçenekle donatmaktır. Cevabımı başlıklı yazmamın nedeni, kullanıcıların Google sonucunu tıklamadan önce bu cevabın faydasını tanımasına yardımcı olmaktır.
Bruno Bronosky

Demek istediğim, cevabınızın bu sorunun gelecekteki okuyucuları için yeni seçenekler (cevaplar) sağlamadığıdır . 1iİlk satırdan önce metin eklemek için varyasyonlarını kullanan dört cevabımız var . Bu soruyu olan bir kişi, problemini çözmek için cevabınızdan ihtiyaç duydukları parçaları çıkarmak zorunda kalacaktır. Sorular ücretsizdir, bu yüzden özel cevabınızı sağlamak için sizden kendi sorunuzu sormaya ve cevaplamaya davet ediyorum.
Jeff Schaller
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.