【问题标题】:How can I use 'sed' in a Linux Bash script file to comment out a particular line with tabbed spacing?如何在 Linux Bash 脚本文件中使用“sed”来注释掉带有标签间距的特定行?
【发布时间】:2017-02-13 07:26:43
【问题描述】:

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

感谢任何帮助!!!谢谢!!!

【问题讨论】:

    标签: linux bash shell ubuntu sed


    【解决方案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 主义,表示前面的一个或多个,更 POSIX-y 你可以这样做

    /auth[[:space:]][[:space:]]*\[success=1 default=ignore\]pam_unix.so[[:space:]]nullok_secure/
    

    (请注意,[:space:] 字符类不只包含空格字符,它是一组空白字符,包括制表符。)

    另请注意,我们必须在您匹配的模式中转义 [,否则它将定义要匹配的事物的字符类,这肯定不是您在这里尝试的。

    作为另一种选择,假设您的 common-auth 看起来像我的,那是唯一带有 success=1 的行,因此您可以使用它,尽管如果其他人在某些时候对文件进行更改,它会更加脆弱。

    【讨论】:

    • 这也有效!非常感谢!我之前一直在尝试\t,但我遇到了其他一些问题。再次感谢!
    【解决方案2】:

    有效...

    sed -e '/^auth\t\[success=1\ default=ignore\]\tpam_unix.so\ nullok_secure/ s/^/#/' -i file
    

    我只是使用\t 而不是[[:tab:]]

    还有\ 而不是[[:space:]]

    【讨论】:

    • "Linux" 非常广泛,因此这可能在某些 Linux 上有效,而在其他 Linux 上则失败。这是哪个sed 版本?
    【解决方案3】:

    你让自己很难受。 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
    

    如果您真的想具体一点,我不会使用空格和制表符查找。只需查找您想要的文本和中间的空白即可。

    【讨论】:

    • 根据 cmets 在另一个答案中,[ 字符是正则表达式元字符,需要转义。也许您还应该描述如何使用文字标签(如果您在编辑器中编写脚本很容易,在许多交互式 shell 中需要 ctrl-V 秘诀)。
    • 另外,逐字重复替换文本有点丑陋。 OP的脚本在这方面更好;或者您可以简单地在替换中使用& 来引用整个匹配的文本。
    • 感谢您的回复!虽然无法让它工作:/我上面的表达式中的正则表达式是我之前使用的命令遗留下来的,以防万一。再次感谢您帮助我!
    猜你喜欢
    • 2020-01-03
    • 2017-06-02
    • 2013-08-23
    • 2017-05-02
    • 2016-11-03
    • 2021-11-28
    • 1970-01-01
    • 2014-06-08
    • 2013-12-01
    相关资源
    最近更新 更多