Jak wstawić tekst po określonym ciągu w pliku?

69

W tej chwili używam echo "Hello World" >> file.txtdo dodania tekstu do pliku, ale muszę również dodać tekst poniżej określonego ciągu, powiedzmy „[opcja]”, czy jest to możliwe sed?

NA PRZYKŁAD:

Plik wejściowy

Some text
Random
[option]
Some stuff

Plik wyjściowy

Some text
Random
[option]
*inserted text*
Some stuff
Javier Villanueva
źródło
1
Musisz być bardziej szczegółowy i podać przykładowy tekst, aby inni mogli pomóc ci w dokładnych poleceniach.
Klemens
proszę edytuj swoje Q i pokazać input, a outputlinie. Ponieważ twoje Q jest niejasne. Możesz także zrobić echo "Hello World [option]" >> file.txt, ale to nie ma sensu.
Zredagowałem pytanie, aby podać więcej informacji w celach informacyjnych, ale zaakceptowałem odpowiedź, którą starałem się osiągnąć
Javier Villanueva
Jeśli chcesz po prostu edytować plik konfiguracyjny, jest to najlepsze rozwiązanie, jakie znalazłem: unix.stackexchange.com/a/78076/20661
rubo77

Odpowiedzi:

104

Dołącz linię po meczu

  • sed '/\[option\]/a Hello World' input

Wstaw linię przed dopasowaniem

  • sed '/\[option\]/i Hello World' input

Dodatkowo możesz wziąć kopię zapasową i edytować plik wejściowy w miejscu za pomocą -i.bkpopcji sed

Rahul Patil
źródło
2
na osx otrzymujęsed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole
w systemie Mac OSX musiałem dodać \ <<NEWLINE>>po aopcji
Tom Howard
Powyższy kod doda / wstawi wiersz dla każdego pojedynczego dopasowania. Jeśli chcesz dołączyć / wstawić wiersz tylko dla pierwszego dopasowania, możesz dodać 0,polecenia: sed '0,/\[option\]/a Hello World' inputlubsed '0,/\[option\]/i Hello World' input
kimbaudi
33

Tak, jest to możliwe dzięki sed:

sed '/pattern/a some text here' filename

Przykład:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
diabelnie
źródło
2
@javiervd Nie jestem pewien, co miałeś na myśli przez pierwszą odpowiedź? Jeśli miałeś na myśli, zanim odpowiedziałeś, to się mylisz. Nie obserwowałeś ostrożnie znaczników czasu!
devnull
Czy istnieje sposób, aby dodać go po dopasowaniu ostatniego ciągu? Na przykład: foo bar option bar option baz . Więc wzorzec stał się foo bar option bar option addedstring baz ?
Ari
4

Z awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Należy pamiętać, że niektóre znaki nie mogą być dołączone dosłownie, dlatego należy użyć sekwencji ucieczki (zaczynają się od odwrotnego ukośnika), np. Aby wydrukować dosłowny odwrotny ukośnik, należy napisać \\.

W rzeczywistości jest tak samo, sedale dodatkowo każda osadzona nowa linia w tekście musi być poprzedzona odwrotnym ukośnikiem:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Więcej informacji na temat sekwencji ucieczki znajduje się w instrukcji.

don_crissti
źródło
Linia awk tak naprawdę nie zmienia tekstu, tylko wyjście.
Josef Klimuk,