Inserir texto no número de linha específico

10

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 acima não funciona, é claro, mas qualquer recomendação que eu possa implementar neste script?

    
por Trent 22.03.2016 / 15:14

4 respostas

7

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 escreve se foram feitas alterações (elas têm) e sai

Ou por correspondência de string:

ex -s -c '/hello/i|world' -c x file.txt
    
por 17.04.2016 / 06:47
7

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

$ 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 no local sem o formulário sed -i não suportá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 .)

    
por 22.03.2016 / 15:22
4

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
    
por 22.03.2016 / 15:20
1
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
    
por 23.03.2017 / 05:24