Вставте текст за певним номером рядка


12

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

Якщо вміст вихідного файлу був уздовж рядків

01 line
01 line
02 line
02 line

Як я можу вставити у рядок 3 цього файлу за допомогою bash, щоб отримати результат

01 line
01 line
text to insert
02 line
02 line

Я сподіваюся зробити це, використовуючи гередок або щось подібне в моєму сценарії

#!/bin/bash

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

Вище сказане не працює, але будь-які рекомендації, які я міг би реалізувати в цьому баш-скрипті?


Відповіді:


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
додав Bonux замінити echo text to insertнаcat file-to-insert.txt
Archemar

1
Принаймні, з bash, замість усіх цих echos, ви могли б використовувати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
Tyþë-Ø

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.