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

Tul*_*aka 5 macos sed

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

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

当前文件内容是

{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}
Run Code Online (Sandbox Code Playgroud)

预期的内容是

{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
 'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}
Run Code Online (Sandbox Code Playgroud)

我正在使用的命令是

sed -i '' "/localhost/a\                        'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'web']," FILENAME
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 10

seda\在要追加的文本之前,BSD/macOS 需要遵循实际的换行符:

sed -i '' "/localhost/ a\\
                        'dev.ops' => ['domain_name' => 'default', 'domain_type' => 'web'],
" FILENAME
Run Code Online (Sandbox Code Playgroud)
  • 由于您使用"..."附上你的sed脚本,a\都必须表示为a\\使\不误续行字符.
    • 通常最好用来'...'封装你的脚本参数,但这里的"..."使用方便了'实例的轻松嵌入.

顺便说一句:GNU sed-安装上通过的MacOS 家酿使用brew install gnu-sed-提供了更多的功能和语法更方便-值得注意的是,无需换行跟随a功能; 有关BSD/macOS sed和GNU 之间所有差异的讨论sed,请参阅我的答案.

  • 我通过安装 gnu-sed 永久解决了这个问题。brew install gnu-sed 并通过从 ~/.bash_profile 添加“gnubin”目录到 PATH 来使用“gnu-sed”作为“sed”,如下所示:export PATH="/usr/local/opt/gnu-sed/libexec/ gnubin:$PATH"。谢谢@mklement0 (4认同)

Vla*_*Aus 3

使用 sedp命令复制行,然后替换

sed '/localhost/p; s/localhost/dev.ops/' FILENAME
Run Code Online (Sandbox Code Playgroud)

输出

{
'localhost' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
'devops' => ['domain_name' => 'default', 'domain_type' => 'mobile'],
}
Run Code Online (Sandbox Code Playgroud)

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

sed -i '' -e '/localhost/p; s/localhost/dev.ops/' FILENAME
Run Code Online (Sandbox Code Playgroud)