Belirli bir satır numarasına metin ekleme


12

Satırdaki verilere bağlı olarak bir metin belgesinin içeriğini bölecek bir bash komut dosyası üzerinde çalışıyorum.

Orijinal dosyanın içeriği

01 line
01 line
02 line
02 line

Sonuç olarak bash kullanarak bu dosyanın 3. satırına nasıl ekleyebilirim?

01 line
01 line
text to insert
02 line
02 line

Bunu bir yorumlu metin veya senaryomda benzer bir şey kullanarak yapmayı umuyorum

#!/bin/bash

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

Yukarıdakiler elbette işe yaramıyor ama bu bash betiğine uygulayabileceğim herhangi bir öneri?


Yanıtlar:


14

Vim'i Ex modunda kullanabilirsiniz:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 3. satırı seç

  2. i metin ve yeni satır ekle

  3. x değişiklikler yapıldıysa yaz (varsa) ve çık

Veya eşleşen dize ile:

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

8

sed geleneksel bir seçim olacaktır (GNU sed muhtemelen bundan daha kolay bir forma sahiptir).

$ 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
$ 

Ya da, son derece geleneksel olmak, ed(bonus! Yerinde olmayan sed -iform olmadan yerinde düzenleme ).

$ (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
$ 

(Bunun bir ilgisi yok bash.)


2
bonux replace echo text to inserttarafından eklendicat file-to-insert.txt
Archemar

1
En azından bash ile, tüm bu echos yerine, kullanabilirsinizprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

Nasıl bir şey hakkında:

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
Garip ama ilginç bir fikir +1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
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.