如何在 sed 中使用正则表达式?

如何在 sed 中使用正则表达式?

我需要在脚本中使用 sed 撤销对用户的 sudo 访问权限。
我只想在该行包含 /bin/su - root 时才评论用户
让我们考虑如下文件,其中我必须仅评论第一行。

mindadmin  ALL = NOPASSWD: /bin/su - root
mindadmin  ALL = NOPASSWD: /bin/ifconfig

我使用过的sed命令如下:

sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin  ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers 

但它不起作用。其中有语法错误吗?

答案1

有两个问题,第一是你的sudoershasmindadmin和你的模式minadmin(没有d)。

第二个问题是在/的 s中/bin/su,您必须在正则表达式中转义这些:

sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin  ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers

否则他们就会结束该模式。

您还可以选择另一个分隔符来代替/,只要文件中没有出现这种情况,您就不必转义它。

答案2

 sed  '/\/bin\/su - root/ s/^/#/'  filename

它找到文件名中包含 的行/bin/su - root,并在行的开头添加注释 (#) (^)。

在 sed 中添加-i选项以影响文件。

答案3

如果您想注释掉/bin/su - root行尾包含的所有行,那么您可以简化 sed 表达式:

sed 's/.*\/bin\/su - root$/#&/'

或者,更简单

sed 's,.*/bin/su - root$,#&,'

要注释掉包含/bin/su - root行中任意位置的所有行:

sed 's,.*/bin/su - root,#&,'

答案4

由于&替换为整个匹配模式,这里有另一个解决方案:

sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers

/被不同的分隔符替换,因此您不需要转义它。如果 su 命令后的间距不同,则该模式也更加灵活。

如果它只改变最小d管理员用户:

sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers

标志 -i 直接将更改应用于文件。

相关内容