以下sed
命令添加my_unix_admins
到以单词 开头的行的末尾AllowGroups
。
/bin/sed -i '/^AllowGroups / s/$/ my_unix_admins/' /etc/ssh/sshd_config
我只想添加 my_unix_admins
如果行中尚不存在的情况(为了不重复条目)。
换句话说,检查它并仅在该行中不存在时添加它。
我怎么做 ?
答案1
一种方法是首先匹配AllowGroups行,然后如果该行不包含“my_unix_admins”,则执行您已经拥有的行尾替换:
sed '/^AllowGroups/ { /my_unix_admins/ !s/$/ my_unix_admins/; }' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new
这使用大括号将“my_unix_admins”搜索分组到AllowGroups 匹配中。这里的另一个重要特征是!
反转执行 s// 替换功能仅有的在做的线上不是匹配之前的范围(此处为 /my_unix_admins/ 模式搜索)。
我已经链接到 GNU sed 在线手册,假设您使用的是 GNU sed,但大括号和反转功能都是由 POSIX 指定所以你也可以查阅当地的手册页。原始命令的唯一非 POSIX 功能是-i
GNU sed 支持的选项。
我能想象的唯一极端情况是,如果您在AllowGroups行中有一个名为“astronomy_unix_admins”或“my_unix_admins_on_mars”的组;那么简单的 /my_unix_admins/ 模式匹配将错误匹配。为了避免潜在的错误匹配,您可以使用 GNU sed 并使用以下选项启用扩展正则表达式(用于交替|
)-E
并使用:
sed -E '/^AllowGroups/ { / my_unix_admins( |$)/ !s/$/ my_unix_admins/; }' < /etc/ssh/sshd_config > /etc/ssh/sshd_config.new
这两个变化是:
- 需要在组名称之前有一个前导空格 - 如果它是列表中的第一个组或列表中的其他任何位置,则为真。
- 需要尾随空格(这将防止行中间的错误匹配)或行尾标记(这允许该组成为行中的最后一个)。