Inserisci il testo in corrispondenza di un numero di riga specifico


12

Sto lavorando a uno script bash che dividerà il contenuto di un documento di testo a seconda dei dati nella riga.

Se il contenuto del file originale fosse simile a

01 line
01 line
02 line
02 line

Come posso inserire nella riga 3 di questo file usando bash per ottenere

01 line
01 line
text to insert
02 line
02 line

Spero di farlo usando un heredoc o qualcosa di simile nella mia sceneggiatura

#!/bin/bash

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

Quanto sopra non funziona ovviamente, ma qualche consiglio che potrei implementare in questo script bash?


Risposte:


14

Puoi usare Vim in modalità Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 seleziona la riga 3

  2. i inserire testo e newline

  3. x scrivere se sono state apportate modifiche (hanno) e uscire

O abbinando la stringa:

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

8

sed sarebbe una scelta tradizionale (GNU sed probabilmente ha una forma più semplice di questa).

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

O, essendo estremamente tradizionale, ed(bonus! Modifica sul posto senza la sed -iforma non portabile ).

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

(Questo non ha nulla a che fare con bash.)


2
aggiunto bonux sostituito echo text to insertdacat file-to-insert.txt
Archemar il

1
Almeno con bash, invece di tutte quelle echos, potresti usareprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

Che ne dici di qualcosa come:

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
Idea strana ma interessante +1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.