我需要找到一种方法在模式之后向文件添加一行,但我不想编辑模式所在的行。
例如,我的原始文件看起来像
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