【问题标题】:What is wrong with my string substitution using sed on Mac OS X?在 Mac OS X 上使用 sed 进行字符串替换有什么问题?
【发布时间】:2015-04-19 22:50:27
【问题描述】:

我想将#Banner none 替换为Banner /etc/sshd_banner 中的/etc/sshd_config。如果我跑

sudo sed -i "s/#Banner none/Banner \/etc\/sshd_banner" /etc/sshd_config

我收到以下错误

sed: 1: "/etc/sshd_config": 未终止的替代模式

关于如何解决此问题的任何想法?

【问题讨论】:

  • 在替换表达式中添加终止 /。阿拉"s/#Banner none/Banner \/etc\/sshd_banner/"
  • 这似乎不起作用。
  • ?意义...?替代品不起作用,或者错误消息没有消失? sed 的优点之一是 / 只是分隔符的约定。尝试sed "s|#Banner none|Banner /etc/sshd_banner|" infile 以简化可读性。

标签: macos sed


【解决方案1】:

使用另一个分隔符

这里我确实使用" 作为分隔符

sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config

通过更改分隔符,您无需转义/

您原来的帖子最后漏掉了一个/

来自 OS X 手册

-i extension
         Edit files in-place, saving backups with the specified extension.  If a zero-length extension
         is given, no backup will be saved.  It is not recommended to give a zero-length extension when
         in-place editing files, as you risk corruption or partial content in situations where disk
         space is exhausted, etc.

zero-length = ""

【讨论】:

  • 正如 Jubobs 指出的那样,它需要是 sed -i .bak ... -i 需要扩展名才能用于备份文件。
【解决方案2】:

试试单引号。此外,如果您想使用 / 以外的其他内容,某些 Sed 要求您转义第一个分隔符。

sudo sed -i 's\:#Banner none:Banner :etc/sshd_banner:' /etc/sshd_config

另一件事是# 可能被解释为一直持续到行尾的注释。

【讨论】:

    【解决方案3】:

    你的命令有三个问题:

    1. 您错过了终止 /
    2. 无论如何,您都不能使用/ 作为分隔符,因为该字符出现在您尝试替换/替换的字符串中。您应该使用不同的字符(例如竖线字符)作为分隔符。
    3. 在 Mac OS X 附带的 sed 版本 (BSD) 中,-i 标志需要 强制 <extension> 参数,您的命令缺少该参数。如果您想使用此版本的sed 就地编辑文件,则应在-i 标志后面添加一个空字符串 ("")。

    总结一下,试试

    sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config
    

    【讨论】:

    • 此答案的第 3 部分非常有帮助,我在谷歌搜索时无法在其他地方找到此信息 - OS X 的 sed 版本是 2005 年 5 月的 BSD 版本,在这种情况下,语法与 GNU sed 不同
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2011-08-31
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多