我怎样才能使用' sed'在Linux Bash脚本文件中注释掉带标签间距的特定行?

时间:2016-10-05 01:14:29

标签: linux bash shell ubuntu sed

我希望添加'#'使用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:]]不是有效的命令。我只是想显示标签出现的位置。

任何帮助表示赞赏!感谢!!!

3 个答案:

答案 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

如果你真的想要具体,我不会使用空格和标签查找。只需查找所需的文本和中间的空白区域。