在 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
函数通过附加所需字符串和空行来替换记录末尾的空行。