Як вставити текст після певного рядка у файл?


69

Зараз я використовую echo "Hello World" >> file.txtдля додавання тексту до файлу, але мені також потрібно додати текст під певним рядком, скажімо, "[параметр]", чи можливо це sed?

EG:

Вхідний файл

Some text
Random
[option]
Some stuff

Вихідний файл

Some text
Random
[option]
*inserted text*
Some stuff

1
Ви повинні бути більш конкретними і надати зразок тексту для людей, щоб допомогти вам з точними командами.
Климент

будь ласка, відредагуйте Q та покажіть рядки inputта outputлінії. Тому що вам Q незрозуміло. Ви також можете echo "Hello World [option]" >> file.txtце зробити , але це не має сенсу.

Я редагував питання, щоб надати більше інформації для довідки, але прийнятою відповіддю було те, що я намагався досягти
Хав'єр Віллануєва,

Якщо ви просто хочете відредагувати конфігураційний файл, це найкраще рішення, яке я знайшов: unix.stackexchange.com/a/78076/20661
rubo77

Відповіді:


104

Додайте рядок після матчу

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

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

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

Крім того, ви можете зробити резервне копіювання та редагувати вхідний файл на місці, використовуючи -i.bkpопцію sed


2
on osx я отримуюsed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole


для Mac OSX мені потрібно було додати \ <<NEWLINE>>після aопції
Том Ховард

Наведений вище код додаватиме / вставлятиме рядок для кожного окремого матчу. Якщо ви хочете додати / вставити рядок лише для першого матчу, ви можете додати 0,до команд: sed '0,/\[option\]/a Hello World' inputабоsed '0,/\[option\]/i Hello World' input
kimbaudi

33

Так, це можливо за допомогою sed:

sed '/pattern/a some text here' filename

Приклад:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$

2
@javiervd Я не впевнений, що ти мав на увазі під першою відповіддю? Якщо ви мали на увазі спочатку відповідь, то ви помиляєтесь. Ви уважно не дотримувались часових позначок!
devnull

Чи є спосіб додати його після відповідного останнього рядка? Наприклад: foo bar option bar option baz . Так зразок став foo bar option bar option addedstring baz ?
Арі

4

З awk:

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

Майте на увазі, що деякі символи не можуть бути включені буквально, тому потрібно використовувати послідовності евакуації (вони починаються із зворотної косої риси), наприклад, для друку буквальної зворотної косої риси, яку потрібно написати \\.

Це насправді те саме, sedале, крім того, кожному вкладеному новому рядку в текст має передувати зворотна риса:

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

Більш детальну інформацію про послідовності втечі див. У посібнику.


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