Inserir texto em um número de linha específico

12

Estou trabalhando em um script bash que dividirá o conteúdo de um documento de texto, dependendo dos dados na linha.

Se o conteúdo do arquivo original estiver ao longo das linhas de

01 line
01 line
02 line
02 line

Como posso inserir na linha 3 deste arquivo usando o bash para resultar em

01 line
01 line
text to insert
02 line
02 line

Espero fazer isso usando um heredoc ou algo semelhante no meu script

#!/bin/bash

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

O exposto acima não funciona, é claro, mas há recomendações que eu possa implementar nesse script bash?

TheLovelySausage
fonte

Respostas:

14

Você pode usar o Vim no modo Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 selecione a linha 3

  2. i inserir texto e nova linha

  3. x escreva se as alterações foram feitas (elas têm) e saia

Ou combinando a string:

ex -s -c '/hello/i|world' -c x file.txt
Steven Penny
fonte
8

sed seria uma escolha tradicional (o GNU sed provavelmente tem uma forma mais fácil que essa).

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

Ou, sendo extremamente tradicional, ed(edição bônus! In-loco sem a sed -iforma não transportável).

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

(Isso não tem nada a ver com bash.)

agitar
fonte
2
adicionado bonux replace echo text to insertporcat file-to-insert.txt
Archemar 22/03
1
Pelo menos com bash, em vez de todas essas echos, você poderia usarprintf '%s\n' 2 a 'text to insert' . wq
evilsoup
6

Que tal algo como:

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
mkomarinski
fonte
1
Ideia estranha, mas interessante +1
Tyþë-Ø 07/06/19
4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
Kamaraj
fonte