2

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

[Unit]
...

[Service]
...

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

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

[Service]
...

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

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

[Service]
... 

с sed, как это:

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

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

1 ответ1

4

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

awk -v RS='\\[[^]]*\\]' '{printf $0; if(oRT~/Unit/){print "---MY LINE---"}; printf RT; oRT=RT}' input_file

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

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

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


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

awk -v RS='\\[[^]]*\\]' 'oRT~/Unit/{sub(/\n$/,"---MY LINE---\n\n")}{printf $0 RT; oRT=RT}' input_file

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .