Добавить строку с помощью sed или awk

711
coverflower

В скрипте bash я должен добавить строку в файл systemd. Файл выглядит так:

[Unit] ...  [Service] ... 

Строка должна быть добавлена ​​в разделе [Unit] и после всех строк в этом разделе:

[Unit] ... ---MY LINE---   [Service] ... 

Я знаю, как добавить строку сразу после [Unit]:

[Unit] ---MY LINE--- ...  [Service] ...  

с sed, как это:

$ sed '/\[Unit\]/a ---MY LINE---' input_file 

но как я могу добавить свою строку после всех строк в разделе?

2

1 ответ на вопрос

4
oliv

Если у вас есть GNU awkв вашей системе, вы можете использовать следующий скрипт. Добавляет строку прямо перед началом следующего раздела.

awk -v RS='\\[[^]]*\\]' '; printf RT; oRT=RT}' input_file 

RSэто разделитель записей. Это регулярное выражение, заданное для чего-либо между квадратными скобками, так что оно совпадает с обоими [Unit]и [Service]. Наличие такого RSпозволяет иметь запись с полным содержанием раздела блока.

RTявляется терминатором записи. Он устанавливается динамически awkдля каждой записи на основе RS. Он будет проходить последовательно [Unit]и [Service].

Хитрость заключается в том, чтобы сохранить терминатор записи в переменной oRT. Если у этого слова есть слово, Unitдобавьте искомую строку ---MY LINE---.


Если вы хотите добавить строку перед пустой строкой в ​​конце раздела, используйте следующий скрипт:

awk -v RS='\\[[^]]*\\]' 'oRT~/Unit/' input_file 

subФункция заменяет пустую строку в конце записи, добавляя разыскиваемую строку и пустую строку.

спасибо, это хорошо, но это ставит пустую строку между последней строкой и моей строкой раздела [Unit], и это прямо перед [Service] без пустой строки между ними. Как я могу это исправить? coverflower 6 лет назад 0
@coverflower, пожалуйста, смотрите обновленный ответ oliv 6 лет назад 0
Большой! Благодарю. Теперь работает отлично. coverflower 6 лет назад 0

Похожие вопросы