Sed 命令仅在第一次出现的特定工作后添加文本

Sed command to add text after specific work for only the first occurence

我想在文件中的特定单词后添加一些单词。

示例:

flags:ia
minfree:5
naflags:ia

我想在 "flags:ia" 之后添加 ,lo,ad,fd,fm,-all 我使用了以下命令:

sudo sed -i.bak "s/flags:ia[^)]*/&,lo,ad,fd,fm,-all/" /etc/security/audit_control

然而我的输出结果是;

flags:ia,lo,ad,fd,fm,-all
minfree:5
naflags:ia,lo,ad,fd,fm,-all

如何让它只影响 "flags:" 而不是 "naflags:"?

您需要使用 [=12=] 而不是 & 来解决替换模式中的当前匹配项:​​

sudo sed -i.bak 's/^flags:ia[^)]*/[=10=],lo,ad,fd,fm,-all/' /etc/security/audit_control

我不确定你为什么要使用 [^)]*。这可能取决于您实际输入的数据。只知道你在问题中显示的输入,我会期望 [^[:space:]]* 相反,或者什么都不知道。


对于 OSX 用户。原来上面的命令在 OSX 上不起作用(我无法测试它,因为我使用的是 Linux)。但是,我们可以在下面的评论中发现以下命令将起作用:

sed '/^flags:ia[^)]*/s/$/,lo,ad,fd,fm,-all/' input.file