Insérer du texte à un numéro de ligne spécifique


12

Je travaille sur un script bash qui divisera le contenu d'un document texte en fonction des données de la ligne.

Si le contenu du fichier d'origine allait dans le sens de

01 line
01 line
02 line
02 line

Comment puis-je insérer dans la ligne 3 de ce fichier en utilisant bash pour aboutir à

01 line
01 line
text to insert
02 line
02 line

J'espère le faire en utilisant un hérédoc ou quelque chose de similaire dans mon script

#!/bin/bash

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

Ce qui précède ne fonctionne pas bien sûr, mais des recommandations que je pourrais implémenter dans ce script bash?


Réponses:


14

Vous pouvez utiliser Vim en mode Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 sélectionnez la ligne 3

  2. i insérer du texte et une nouvelle ligne

  3. x écrire si des modifications ont été apportées (elles l'ont été) et quitter

Ou en faisant correspondre une chaîne:

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

8

sed serait un choix traditionnel (GNU sed a probablement une forme plus simple que celle-ci).

$ 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, étant extrêmement traditionnel, ed(bonus! Édition sur place sans la sed -iforme non transférable ).

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

(Cela n'a rien à voir avec bash.)


2
ajouté bonux remplacer echo text to insertparcat file-to-insert.txt
Archemar

1
Au moins avec bash, au lieu de tous ces echos, vous pouvez utiliserprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

Que diriez-vous de quelque chose comme:

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
Idée étrange mais intéressante +1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.