Dosyanın ikinci satırına komut satırından nasıl yazabilirim?


29

Bir çıktı dosyası üreten harici bir programım var (genişleme, 20K satır mümkün).

Mevcut satır 1 ve satır 2 arasına yeni bir satır eklemem gerekiyor. Awk ve sed'e baktım - oldukça düzenli olarak her birinde bir gömlek kullanıyorum - ancak doğru anahtarlarla gelemedim Bunu yap.

Yanıtlar:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
Biraz daha kısa:awk 'NR==2 {print "new line"} 1'
Glenn Jackman

@glennjackman: sürümünüz benim sistemimde çalışmıyor, ancak cevap çalışıyor. Özellikle, sizinkiyle, satır 2 çoğaltılır ve yeni satır her ikisi arasına eklenir (satır 3 gibi).
Nikana Reklawyks

2. satıra yazmaya başlamanın ve sonraki tüm satırların üzerine yazmanın bir yolu var mı?
CMCDragonkai

@ CMCDragonkai Ne istediğinizi tam olarak bilmiyorum. Sadece belirtilen dosyanın ilk satırını ve ikinci satırını yazdırabilir misin? Önce ilk satır sonra da dosyanın içeriği? İlk dosyanın ilk satırı ve ardından ilk kalan her satır için ikinci bir dosyadan gelen satır? Ne istediğinizi çok spesifik bir açıklama ile ve nispeten kısa ama tam bir örnek ile yeni bir soru sormak isteyebilirsiniz.
Kevin

16

Özel durumunuz için bu daha basit olmalı:

sed '1 { P ; x }' your-file

Açıklama: 1. satırda aşağıdakileri yapın

  1. P hattı Rint
  2. E x desen alanını tutma alanıyla değiştirir (temel olarak arabellek boşaltır)

Ardından, satır (şimdi boş) döngünün bir parçası olarak tekrar yazdırılır.


Eğer yeni bir satır karakteri yerine yeni bir satır eklemek istiyorsanız (başlangıçta ne anladım) o zaman sadece komutunu kullanın (ekleyin):seda\

sed '1 a\
appended line' your-file

ya da

sed '1 aappended line' your-file

appended line1. satırdan sonra " " ekler .


1
sed -i '1 a\\' filesadece bir yeni hat için.
forcefsck

1
@forcefsck Evet, tek dezavantaj, ikinci '1 aapended line'örneğimin bir GNUizm olması .
angus

8

Sanırım sedyaklaşım şöyle olurdu:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Bu, metni dosyanın ikinci satırına yerleştirir ve dosyadaki gerçek ikinci satır üçüncü olur.

Ekleme modunu kullanmak gerekirse, ilk satır kullanmak zorundaydı, çünkü ekleme, belirtilen satır numarasından sonra gerçekleşecek.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

Bu sizin için işe yarayabilir:

sed 1G file

Eklemek istersen somethingNewline'dan sonra :

sed '1{G;s/$/something/}' file

Veya başa çıkarsan \n :

sed '1s/$/\nsomething/' file

Tabii ki adaha da kolay:

sed '1a something' file

Üzgünüm, ne işe yarıyor?
Nikhil Mulley

Bu satırı 1'in ardından bir yeni satır ekler
Potong

1
Veya daha doğrusu birinci \nhatta yeni bir satır ekler !
potong

1

Genelde bunun için kullanırım ed:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

Bir sedçözüme benzer , ancak kaçan yeni hatların dağınıklığı olmadan.


2
Bazılarını echo, özellikle de bash: altında yedekleyebilirsiniz ed - filename <<< $'1a\nLine to insert\n.\nw'.
Manatwork,

1
Tüm dashsistemlerde, örneğin birçok sistemde olduğu gibi çalışmaz /bin/sh.
Arcege,

1
Bu yüzden “ Bazılarını ayırabilirsin” yazdım echo. Ayırma tüm echo 'ın gerçekten de bashtek özelliği, ancak azaltılmasında echo4 1 eserlerden sayımı dashve kshçok: echo '1a\nLine to insert\n.\nw' | ed - filename.
Manatwork 17

1
Ya da sadece, kullandığınızprintf %s\\n her argümandan sonra yeni bir satır koyan ve eklemek istediğiniz satıra gömülü özel karakterleri bozmayan kullanın. Ayrıca, neden uygun edolduğunda kullanın ex?
Joker

1

Python Çözümü

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt

0

Kullanılması sedANSI çıkış kodları ve (Bash özel):

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'

0

Bunun için python kullanırım

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`

0

Açık bir sayaç kullanmaktan hoşlanıyorum:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file

0

En basit yöntem kullanır printfve ex:

printf '%s\n' 1a 'my line to insert' . x | ex file

1a"ilk satırdan sonra ekle" anlamına gelir; .dosya eklemeyi sona erer xkaydet ve çık anlamına gelir.


0

Yukarıdaki cevapların hiçbiri değişiklikleri orijinal dosyaya nasıl kaydedeceğinden bahsetmiyor. OP'nin ne istediğini düşünüyorum.

Bu sayfaya girdiğimde kesinlikle ihtiyacım olan şeydi.

Yani dosyanızın çağrıldığını varsayarsak output.txt

sed -i '1 a This is the second line' output.txt

Özel kullanım durumum otomatik olarak bir xsl stil sayfası bildirimini bir junit xml dosyasına eklemek.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml

yourownlinux.com/2015/04/… iyi yazılmış bir tanıtımın baştan sona bir parçası.
şempanze
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.