Insertar texto en un número de línea específico


12

Estoy trabajando en un script bash que dividirá el contenido de un documento de texto dependiendo de los datos en la línea.

Si el contenido del archivo original estuviera en la línea de

01 line
01 line
02 line
02 line

¿Cómo puedo insertar en la línea 3 de este archivo usando bash para dar como resultado

01 line
01 line
text to insert
02 line
02 line

Espero hacer esto usando un heredoc o algo similar en mi script

#!/bin/bash

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

Lo anterior no funciona, por supuesto, pero ¿alguna recomendación que pueda implementar en este script bash?


Respuestas:


14

Puede usar Vim en modo Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 seleccione línea 3

  2. i insertar texto y nueva línea

  3. x escriba si se han realizado cambios (lo han hecho) y salga

O haciendo coincidir la cadena:

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

8

sed sería una opción tradicional (GNU sed probablemente tiene una forma más fácil que esta).

$ 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, siendo extremadamente tradicional, ed(¡bonificación! Edición en el lugar sin la sed -iforma no portable ).

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

(Esto no tiene nada que ver con bash).


2
Bonux agregado reemplazado echo text to insertporcat file-to-insert.txt
Archemar

1
Al menos con bash, en lugar de todos esos echos, podrías usarprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

¿Qué 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
Idea extraña pero interesante +1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.