Shell BSD sed;“错误”;“未替换的换行线内部替换模式”;从脚本运行时
我正在尝试使用(BSD)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:\
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兔子洞去找出原因