Wstaw tekst pod określonym numerem wiersza

12

Pracuję nad skryptem bash, który podzieli zawartość dokumentu tekstowego w zależności od danych w wierszu.

Jeśli zawartość oryginalnego pliku była zgodna z

01 line
01 line
02 line
02 line

Jak mogę wstawić do wiersza 3 tego pliku, używając bash, aby uzyskać wynik

01 line
01 line
text to insert
02 line
02 line

Mam nadzieję, że zrobię to za pomocą heredoc lub czegoś podobnego w moim skrypcie

#!/bin/bash

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

Powyższe nie działa oczywiście, ale jakieś zalecenia, które mógłbym wdrożyć w tym skrypcie bash?

TheLovelySausage
źródło

Odpowiedzi:

14

Możesz używać Vima w trybie Ex:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 wybierz linię 3

  2. i wstaw tekst i nowy wiersz

  3. x napisz, jeśli dokonano zmian (mają) i wyjdź

Lub dopasowując ciąg:

ex -s -c '/hello/i|world' -c x file.txt
Steven Penny
źródło
8

sed byłby tradycyjnym wyborem (GNU sed prawdopodobnie ma łatwiejszą formę niż to).

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

Lub, będąc wyjątkowo tradycyjnym, ed(premia! Edycja na miejscu bez nieprzenoszalnej sed -iformy).

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

(To nie ma nic wspólnego bash.)

gałązka
źródło
2
dodany Bonux zastąpić echo text to insertprzezcat file-to-insert.txt
Archemar
1
Przynajmniej z bash, zamiast tych wszystkich, których echomożesz użyćprintf '%s\n' 2 a 'text to insert' . wq
evilsoup
6

Co powiesz na coś takiego:

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
mkomarinski
źródło
1
Dziwny, ale ciekawy pomysł +1
Tyþë-Ø
4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
Kamaraj
źródło