【问题标题】:Config modification with sed使用 sed 修改配置
【发布时间】:2016-11-04 01:18:28
【问题描述】:

对不起,这是一个快速的。我正在尝试使用简单的 sed 命令修改 ssh 配置文件的值(作为执行许多功能的较大脚本的一部分)。我似乎无法弄清楚为什么它不起作用。这是我要更改的配置行:

PermitRootLogin without-password

这是我的代码:

    sed 's/^\(PermitRootLogin\s*.\s*\).*$/\1Yes/' sshd_config

因此,我们的目标是将“无密码”替换为“是”。它似乎有效,只是我收到了这个:

PermitRootLogin wYes

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    试试这个:

    sed 's/^\(PermitRootLogin \).*/\1Yes/' sshd_config
    

    使用-i 选项就地编辑文件

    sed -i 's/^\(PermitRootLogin \).*/\1Yes/' sshd_config
    

    您的模式正在捕获w,因为它是正则表达式\s*. 中零个或多个空格(\s*)之后的第一个字符(.

    【讨论】:

    • 我会接受正确的,但我必须等待 9 分钟。我在您发布的同时发布了我自己的问题的答案,所以它现在已经延迟
    【解决方案2】:

    让我们分解正则表达式:

    ^\(PermitRootLogin\s*.\s*\).*$
    
    • ^ 匹配行首
    • \( 启动捕获组
    • PermitRootLogin 匹配该指令
    • \s* 匹配指令后最长的空格序列
    • . 匹配空格后的第一个字符,即without-password 开头的w
    • \s* 匹配 w 之后的最长空格序列。由于那里没有空格,它匹配空字符串。
    • \) 结束捕获组

    以上所有内容都被放入捕获组1

    • .* 匹配之后的所有内容。
    • $ 匹配行尾。

    所以捕获组1 包含PermitRootLogin w。然后将其复制到替换中,并添加Yes。结果是

    PermitRootLogin wYes
    

    我会用

    sed 's/^PermitRootLogin\s.*$/PermitRootLogin Yes/' sshd_config
    

    当您不需要将任何变量匹配复制到替换时,就不需要捕获组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-24
      • 2023-02-22
      • 2012-10-10
      • 2011-06-21
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多