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

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


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
$

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.


Linia awk tak naprawdę nie zmienia tekstu, tylko wyjście.
— Josef Klimuk,
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.