使用 sed 或 awk 添加行

使用 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就可以拥有包含块部分完整内容的记录。

RTawk是记录终止符。它由针对基于 的每条记录动态设置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函数通过附加所需字符串和空行来替换记录末尾的空行。

相关内容