如何使用sed为匹配指定模式的行开头添加#注释符
sed指定行添加注释失效解决方案
失效原因
- 拼写错误:待匹配的目标行末尾参数为
use_uid,你编写的匹配规则里误写为use_ui,缺失末尾字符d,无法命中对应行。 - 硬编码固定空格容错性极差:系统配置文件中字段间的分隔符可能是不定数量的空格、制表符,你在规则里写死了固定个数的连续空格,只要实际文件里的分隔空白数量和规则不一致,就会匹配失败。
正确操作命令
推荐使用「正则匹配定位目标行+行首插入注释符」的写法,不需要重复书写整行内容,也不会受字段间空白数量/类型影响:
- 先执行预览命令确认匹配效果,该命令不会修改原文件,只会把修改后的结果输出到终端:
sed '/^auth[[:space:]]\+required[[:space:]]\+pam_wheel\.so[[:space:]]\+use_uid/s/^/#/' /etc/pam.d/su
- 检查终端输出,确认目标行已经正确加上
#前缀后,再执行带-i参数的命令写入修改到原文件:
sed -i '/^auth[[:space:]]\+required[[:space:]]\+pam_wheel\.so[[:space:]]\+use_uid/s/^/#/' /etc/pam.d/su
注意:匹配规则里
pam_wheel.so的.需要加反斜杠转义,正则语法中.默认匹配任意单个字符,不转义可能出现非预期的误匹配。
写法说明
如果一定要使用整行替换的逻辑,除了修正use_uid的拼写错误,还需要保证匹配串里的连续空格数量和目标文件里的完全一致,这种写法可移植性极差,只要配置格式稍有变动就会失效,不建议使用。
内容的提问来源于stack exchange,提问作者Jona187
相关产品推荐
相关产品推荐

