Shell BSD sed;“错误”;“未替换的换行线内部替换模式”;从脚本运行时

Shell BSD sed;“错误”;“未替换的换行线内部替换模式”;从脚本运行时,shell,sed,sh,freebsd,Shell,Sed,Sh,Freebsd,我正在尝试使用(BSD)sed修改我的/etc/gettytab。目标是修改此条目: P|Pc|Pc console:\ :ht:np:sp#9600: P|Pc|Pc console:\ :ht:np:sp#115200:\ :cl=\E[H\E[2J: 本条目的: P|Pc|Pc console:\ :ht:np:sp#9600: P|Pc|Pc console:\ :ht:np:sp#115200:\

我正在尝试使用(BSD)
sed
修改我的
/etc/gettytab
。目标是修改此条目:

P|Pc|Pc console:\
        :ht:np:sp#9600:
P|Pc|Pc console:\
        :ht:np:sp#115200:\
        :cl=\E[H\E[2J:
本条目的:

P|Pc|Pc console:\
        :ht:np:sp#9600:
P|Pc|Pc console:\
        :ht:np:sp#115200:\
        :cl=\E[H\E[2J:
如果我发出下面的命令(在两行上),它就可以完美地工作

# sed -in ' /P|Pc|Pc console/,/^#/ s/9600:/115200:\\\\  
        :cl=\E[H\E[2J:/' /etc/gettytab
但是,如果我在脚本中使用完全相同的命令(字面上是复制/粘贴),我会收到一条错误消息:

sed: 1: " /P|Pc|Pc console/,/^#/ ...": unescaped newline inside substitute pattern
搜索时,我发现了这篇文章:它谈到了尾随的
/
,但我的模式中有这一点


如果有人能帮我解决我的错误,我将不胜感激。

在脚本中,您可以使用
\
转义换行符,并转义嵌入到输出中的
\
,以便逐字解释。如果我的数学是正确的,那就是三个反斜杠,而不是四个反斜杠

$ cat i
P|Pc|Pc console:\
        :ht:np:sp#9600:
$ cat i.sh
#!/bin/sh

#                                  ┏━━━ escapes the next character,
#                                  ┃┏━━ literal backslash for output,
#                                  ┃┃┏━ escapes the newline.
sed -ne '/^P|/,/^#/ s/9600:/115200:\\\
        :cl=\E[H\E[2J:/' -e p i

$ ./i.sh
P|Pc|Pc console:\
        :ht:np:sp#115200:\
        :cl=E[HE[2J:
$

我认为交互式shell使用四个反斜杠的唯一原因是FreeBSD的默认shell是tcsh。不过,我不会潜到csh兔子洞去找出原因