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?


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

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.)


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.