【问题标题】:extra characters after \ at the end of a command在命令末尾的 \ 之后的额外字符
【发布时间】:2017-04-12 03:46:17
【问题描述】:

当我尝试使用 sed 在 OSX 中插入新行时,出现以下错误

命令末尾的 \ 后面的额外字符

当前文件内容是

{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

预期内容是

{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
 'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

我使用的命令是

sed -i '' "/localhost/a\                        'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'web']," FILENAME

【问题讨论】:

标签: macos sed


【解决方案1】:

使用 sed p 命令复制行然后替换

sed '/localhost/p; s/localhost/dev.ops/' FILENAME

输出

{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
'devops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}

或者要在 OSX 上进行编辑而不保留备份,请使用 -i ''

sed -i '' -e '/localhost/p; s/localhost/dev.ops/' FILENAME

【讨论】:

    【解决方案2】:

    BSD/macOS sed 要求在 a\ 后面加上一个实际的换行符,在要附加的文本之前:

    sed -i '' "/localhost/ a\\
                            'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'web'],
    " FILENAME
    
    • 由于您使用"..." 来包围您的sed 脚​​本,a\ 必须表示为a\\,这样\ 就不会被误认为是行继续符。
      • 通常最好使用'...' 括起您的脚本参数,但这里使用"..." 便于轻松嵌入' 实例。

    顺便说一句:GNU sed - 可通过 Homebrew 使用 brew install gnu-sed 在 macOS 上安装 - 提供更多功能和更方便的语法 - 值得注意的是,a 函数后面不需要换行符;有关 BSD/macOS sed 和 GNU sed 之间所有差异的讨论,请参阅我的 this answer

    【讨论】:

    • 我通过安装 gnu-sed 永久解决了这个问题。 brew install gnu-sed 并使用“gnu-sed”作为“sed”,方法是将“gnubin”目录从 ~/.bash_profile 添加到 PATH,如下所示:export PATH="/usr/local/opt/gnu-sed/libexec/ gnubin:$PATH"。谢谢@mklement0
    猜你喜欢
    • 2014-11-22
    • 2018-07-07
    • 2021-01-30
    • 1970-01-01
    • 2013-03-20
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多