Masukkan teks pada nomor baris tertentu


12

Saya sedang mengerjakan skrip bash yang akan membagi konten dokumen teks tergantung pada data di baris tersebut.

Jika isi file asli berada di sepanjang baris

01 line
01 line
02 line
02 line

Bagaimana saya bisa menyisipkan ke baris 3 file ini menggunakan bash untuk menghasilkan

01 line
01 line
text to insert
02 line
02 line

Saya berharap untuk melakukan ini menggunakan heredoc atau sesuatu yang serupa dalam skrip saya

#!/bin/bash

vim -e -s ./file.txt <<- HEREDOC
    :3 | startinsert | "text to insert\n"
    :update
    :quit
HEREDOC

Tentu saja di atas tidak berfungsi tetapi ada rekomendasi yang bisa saya terapkan ke dalam skrip bash ini?


Jawaban:


14

Anda dapat menggunakan Vim dalam mode Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 pilih jalur 3

  2. i masukkan teks dan baris baru

  3. x tulis jika perubahan telah dibuat (sudah) dan keluar

Atau dengan string yang cocok:

ex -s -c '/hello/i|world' -c x file.txt

8

sed akan menjadi pilihan tradisional (GNU sed mungkin memiliki bentuk yang lebih mudah daripada ini).

$ cat input
01 line
01 line
02 line
02 line
$ sed '2a\
text to insert
' < input
01 line
01 line
text to insert
02 line
02 line
$ 

Atau, karena sangat tradisional, ed(bonus! Sunting di tempat tanpa sed -iformulir yang tidak dapat ditayangkan ).

$ (echo 2; echo a; echo text to insert; echo .; echo wq) | ed input
32
01 line
47
$ cat input
01 line
01 line
text to insert
02 line
02 line
$ 

(Ini tidak ada hubungannya dengan bash)


2
ditambahkan bonux replace echo text to insertolehcat file-to-insert.txt
Archemar

1
Setidaknya dengan bash, alih-alih semua echoitu, Anda bisa menggunakanprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

Bagaimana dengan sesuatu seperti:

head -n 2 ./file.txt > newfile.txt
echo "text to insert" >> newfile.txt
tail -n +3 ./file.txt >> newfile.txt
mv newfile.txt file.txt

1
Ide aneh tapi menarik +1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.