Вставить текст под конкретным номером строки


12

Я работаю над сценарием bash, который будет разбивать содержимое текстового документа в зависимости от данных в строке.

Если содержимое исходного файла было в соответствии с

01 line
01 line
02 line
02 line

Как я могу вставить в строку 3 этого файла, используя bash, чтобы привести к

01 line
01 line
text to insert
02 line
02 line

Я надеюсь сделать это, используя heredoc или что-то подобное в моем скрипте

#!/bin/bash

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

Выше не работает, конечно, но какие-либо рекомендации, которые я мог бы реализовать в этом скрипте bash?


Ответы:


14

Вы можете использовать Vim в режиме Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 выберите строку 3

  2. i вставить текст и перевод строки

  3. x написать, если изменения были сделаны (они есть) и выйти

Или по соответствующей строке:

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

8

sed было бы традиционным выбором (GNU sed, вероятно, имеет более простую форму, чем эта).

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

Или, будучи чрезвычайно традиционным, ed(бонус! Редактирование на месте без непортативной sed -iформы).

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

(Это не имеет ничего общего с bash.)


2
добавлено замену бонукса echo text to insertнаcat file-to-insert.txt
Archemar

1
По крайней мере, с Bash, вместо всех тех echo, которые вы могли бы использоватьprintf '%s\n' 2 a 'text to insert' . wq
Evilsoup

6

Как насчет чего-то вроде:

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
Странная, но интересная идея +1
Тына-Ø

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.