sed 可以在匹配模式后添加新行而不编辑行模式吗?

sed 可以在匹配模式后添加新行而不编辑行模式吗?

我需要找到一种方法在模式之后向文件添加一行,但我不想编辑模式所在的行。

例如,我的原始文件看起来像

group: misc
host: server1
job: internal

我想把它变成类似的东西

group: misc
host: server1
role: webserver
job: internal

困难是我需要匹配“主机:”,但主机后面的名称每次都会不同。我还没有找到一种方法让 sed 尊重该行的其余部分,而是在找到“host:”后立即转储新行,使主机名在新行之后成为孤立的。

答案1

a匹配后追加文本:

sed '/^host: /a\
role: webserver
' sample

或者i在匹配之前插入一行:

sed '/^job: /i\
role: webserver
' sample

答案2

类似于马库斯的回答,将行尾 ( $) 替换为换行符以及要在以 开头的行中插入的行host:

$ sed '/host: / s/$/\nrole: webserver/ ' file
group: misc
host: server1
role: webserver
job: internal

这将需要 GNU (或支持它的sed任何其他实现)作为右侧的。如果上述方法失败,请尝试:sed\n

$ sed '/host: / s/$/\
role: webserver/' file
group: misc
host: server1
role: webserver
job: internal

答案3

当然,这是一个非常基本的正则表达式:用于.*匹配一切, 一个任意次数;因为 sed 是基于行的,无论如何,它只能工作到每一行的末尾。

所以,你完整的 GNU sed 调用是

sed 's/^host: .*$/&\nrole: webserver/'

答案4

使用sed

$ sed '/^host.*/{p;s//role: webserver/}' input_file
group: misc
host: server1
role: webserver
job: internal

相关内容