【问题标题】:BSD sed; error "unescaped newline inside substitute pattern" when run from scriptBSD 赛德;从脚本运行时出现错误“替代模式内未转义的换行符”
【发布时间】:2018-08-19 03:21:37
【问题描述】:

我正在尝试使用 (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:

如果我发出下面的命令(它在两行上),它会完美运行。

# 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

搜索,我发现了这篇文章:unescaped newline inside substitute pattern,它谈到了尾随的/,但我的模式中有这个。

如果有人能帮助我解决我做错了什么,我将不胜感激。

【问题讨论】:

    标签: shell sed sh freebsd


    【解决方案1】:

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

    $ 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 兔子洞来找出原因。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2019-08-23
    相关资源
    最近更新 更多