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?


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

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.)


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.