Bagaimana saya bisa menulis ke baris kedua file dari baris perintah?

29

Saya memiliki program eksternal yang menghasilkan file output (garis besar, 20K mungkin).

Saya perlu memasukkan baris baru antara baris 1 yang ada dan 2. Saya sudah melihat awk dan sed - saya menggunakan satu liner di masing-masing cukup teratur - tetapi saya belum bisa datang dengan switch yang tepat untuk melakukan hal ini.

Tim Brigham
sumber

Jawaban:

20
awk 'NR==1{print; print "new line"} NR!=1'
Kevin
sumber
12
Sedikit lebih pendek:awk 'NR==2 {print "new line"} 1'
glenn jackman
@glennjackman: versi Anda tidak berfungsi di sistem saya, tetapi jawabannya tidak. Khususnya, dengan Anda, jalur 2 diduplikasi dan baris baru disisipkan di antara keduanya (sehingga seperti baris 3).
Nikana Reklawyks
Apakah ada cara untuk mulai menulis di baris ke-2 dan menimpa semua baris selanjutnya?
CMCDragonkai
@ CMCDragonkai Saya tidak yakin apa yang Anda minta. Cukup cetak baris pertama dari file yang ditentukan dan satu set baris kedua? Baris pertama dan kemudian isi file? Baris pertama dari file pertama dan kemudian satu baris dari file kedua untuk setiap baris yang tersisa di baris pertama? Anda mungkin ingin mengajukan pertanyaan baru dengan deskripsi yang sangat spesifik tentang apa yang Anda inginkan, dan contoh yang relatif singkat namun lengkap.
Kevin
16

Untuk kasus spesifik Anda, ini harus lebih sederhana:

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

Penjelasan: pada baris 1 , lakukan hal berikut

  1. P rintis garis
  2. E x mengubah ruang pola dengan ruang holding (pada dasarnya mengosongkan buffer)

Kemudian, garis (kosong sekarang) dicetak lagi sebagai bagian dari siklus.


Jika Anda ingin menambahkan baris baru alih-alih karakter baris baru (apa yang saya mengerti awalnya) maka gunakan saja sedperintah a\(append):

sed '1 a\
appended line' your-file

atau bahkan

sed '1 aappended line' your-file

" appended line" Ditambahkan setelah baris 1.

angus
sumber
1
sed -i '1 a\\' filehanya untuk baris baru.
forcefsck
1
@ Forcefsck Ya, satu-satunya kelemahan adalah GNUism, sebagai '1 aapended line'contoh kedua saya .
angus
8

Saya kira sedpendekatannya adalah:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Ini akan membawa teks ke baris kedua file dan kemudian baris kedua yang sebenarnya dengan dalam file akan menjadi yang ketiga.

Perhatikan bahwa, menggunakan mode append , jika harus, itu harus menggunakan baris pertama, karena append akan terjadi setelah nomor baris dicatat.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Nikhil Mulley
sumber
3
sed ':a;N;$!ba;s/\n/\n\n\n/' yourBigFile

Penjelasan.

Abhijeet Rastogi
sumber
2

Ini mungkin bekerja untuk Anda:

sed 1G file

Jika Anda ingin menyisipkan somethingsetelah baris baru:

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

Atau jika Anda sed menangani \n:

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

Tentu saja alebih mudah:

sed '1a something' file
potong
sumber
Maaf, apa fungsinya?
Nikhil Mulley
Ini memasukkan baris baru setelah baris 1
potong
1
Atau lebih tepatnya menambahkan baris baru \nke baris satu!
potong
1

Saya biasanya menggunakan edini:

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

Serupa dengan sedsolusi, tetapi tanpa kekacauan dari baris baru yang lolos.

Arcege
sumber
2
Anda bisa meluangkan beberapa echo's, terutama di bawah bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
manatwork
1
Tidak bekerja di semua shell, misalnya di dash, yang pada banyak sistem /bin/sh.
Arcege
1
Itu sebabnya saya menulis "Anda bisa menyisihkan beberapa echo milik". Sparing semua echo 's memang bashhanya fitur, tetapi mengurangi echojumlah 4-1 karya di dashdan kshjuga: echo '1a\nLine to insert\n.\nw' | ed - filename.
manatwork
1
Atau gunakanprintf %s\\n saja , yang menempatkan baris baru setelah setiap arg yang Anda berikan dan tidak mengacaukan karakter khusus yang tertanam di baris yang ingin Anda masukkan. Juga, mengapa digunakan edsaat extersedia?
Wildcard
1

Solusi Python

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

Menggunakan seddan (Escape khusus) ANSI kode melarikan diri:

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

saya akan menggunakan python untuk ini

import fileinput

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

Saya hanya suka menggunakan penghitung eksplisit:

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

Metode paling sederhana menggunakan printfdan ex:

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

1aberarti "tambahkan setelah baris pertama"; yang .berakhir menambahkan tersebut; xberarti simpan dan keluar.

Wildcard
sumber
0

Tidak ada jawaban di atas yang menyebutkan bagaimana cara menyimpan perubahan ke file asli, yang saya pikir apa yang diminta OP.

Itu tentu yang saya butuhkan ketika saya membuka halaman.

Jadi dengan asumsi file Anda dipanggil output.txt

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

Kasus penggunaan khusus saya adalah secara otomatis menambahkan deklarasi stylesheet xsl ke file junit xml.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml
chim
sumber
yourownlinux.com/2015/04/... adalah bagian yang relevan dari pengantar yang ditulis dengan baik.
chim