在命令结尾处\后的额外字符

时间:2016-11-28 12:11:12

标签: macos sed

当我尝试使用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

2 个答案:

答案 0 :(得分:8)

BSD / macOS sed要求实际换行符跟随a\ ,然后才能追加文字:

sed -i '' "/localhost/ a\\
                        'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'web'],
" FILENAME
  • 由于您使用"..."封闭了sed脚本,因此a\必须表示为a\\,以便\不会被误认为是'...'线延续字符。
    • 通常最好使用"..."来封装您的脚本参数,但使用'可以方便地嵌入sed个实例。

暂且不说:GNU brew install gnu-sed - 可以通过Homebrew使用a安装在macOS上 - 提供更多功能和更方便的语法 - 特别是,无需关注换行符sed函数;有关BSD / macOS sed和GNU {{1}}之间所有差异的讨论,请参阅我的this answer

答案 1 :(得分: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