我希望添加'#'使用sed在特定文件中的这一行的开头。该脚本将在.sh文件中运行,而不是在控制台中输入。
auth [success=1 default=ignore] pam_unix.so nullok_secure
应该是:
#auth [success=1 default=ignore] pam_unix.so nullok_secure
我目前正尝试类似以下的命令:
sudo sed -e '/auth[[:tab:]][success=1[[:space:]]default=ignore][[:tab:]]pam_unix.so[[:space:]]nullok_secure/ s/^#*/#/' -i /etc/pam.d/common-auth
我知道上面的命令是错误的,因为[[:tab:]]
不是有效的命令。我只是想显示标签出现的位置。
任何帮助表示赞赏!感谢!!!
答案 0 :(得分:1)
在Ubuntu上,您可以使用\t
作为标签,我相信甚至在POSIX中指定。
/auth\t\[success=1 default=ignore\]\tpam_unix.so nullok_secure/
我认为我在BSD上遇到了这样的问题但是如果你真的不在乎它只是一个标签,并且即使它有其他类型的空格也会接受该行,你可能会多一点柔性
/auth[[:space:]]\+\[success=1 default=ignore\]pam_unix.so[[:space:]]nullok_secure/
这是一个GNU-ism,\+
表示前面的一个或多个,你可以做更多的POSIX-y
/auth[[:space:]][[:space:]]*\[success=1 default=ignore\]pam_unix.so[[:space:]]nullok_secure/
(请注意,[:space:]
字符类不仅包含空格字符,而是包含制表符的空白字符集。)
另请注意,我们必须在您匹配的模式中转义[
,否则它将定义要匹配的字符类,这肯定不是您在这里尝试的。
作为另一种选择,假设您的common-auth
看起来像我的,那就是唯一一条success=1
就行,所以您可以使用它,但如果其他人对文件进行更改则会更脆弱一段时间。
答案 1 :(得分:0)
它有效......
sed -e '/^auth\t\[success=1\ default=ignore\]\tpam_unix.so\ nullok_secure/ s/^/#/' -i file
我只是使用\t
代替[[:tab:]]
而\
代替[[:space:]]
答案 2 :(得分:-1)
你自己也很努力。 authconfig文件是标准文件,不需要您正在使用的所有正则表达式。
sed -i 's/^auth [success=1 default=ignore] pam_unix.so nullok_secure/#auth [success=1 default=ignore] pam_unix.so nullok_secure/' /etc/pam.d/common-auth
如果你真的想要具体,我不会使用空格和标签查找。只需查找所需的文本和中间的空白区域。