Добавить строку с помощью sed или awk
В скрипте bash я должен добавить строку в файл systemd. Файл выглядит так:
[Unit]
...
[Service]
...
Строка должна быть добавлена в разделе [Unit] и после всех строк в этом разделе:
[Unit]
...
---MY LINE---
[Service]
...
Я знаю, как добавить строку сразу после [Unit]:
[Unit]
---MY LINE---
...
[Service]
...
с помощью sed вот так:
$ sed '/\[Unit\]/a ---MY LINE---' input_file
но как я могу добавить свою строку после всех строк в разделе?
1 ответ
Если у вас есть 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
Функция заменяет пустую строку в конце записи добавлением искомой строки и пустой строки.