FreeBSD sed in shell script:命令a expect \后跟文本

时间:2014-12-25 07:57:48

标签: shell sed escaping freebsd

我编写脚本以在我的开发计算机上创建Web主机。 它必须为主机创建目录并更改nginx配置文件。 当我尝试使用双引号添加字符串配置文件时生成错误:

#!/bin/sh

webdir="/var/chroot/www"
destdir="${webdir}/$1"
nginxconfig="/usr/local/etc/nginx/nginx.conf"

sed "/hostsection/ a\
\
  server {\
    listen 80;\
    server_name $1 www.$1;\
    root  ${destdir}/www;\
    include /usr/local/etc/nginx/yii-rewrite.conf;\
    access_log ${destdir}/access_log main;\
    error_log ${destdir}/error_log error;\
  }\
\
" ${nginxconfig}

错误如下所示:

sed: 1: "/hostsection/ a  server ...": command a expects \ followed by text

如果我尝试使用单引号

....
sed '/hostsection/ a\
...
' ${nginxconfig}

sed工作正常,但它不会在开始每个字符串时替换字符串中的变量和修剪空格:

#  hostsection

server {
listen 80;
server_name $1 www.$1;
root  ${destdir}/www;
include /usr/local/etc/nginx/yii-rewrite.conf;
access_log ${destdir}/access_log main;
error_log ${destdir}/error_log error;
error_page 413 /413.html;
}

如何更正我的脚本以消除双引号中的sed错误?

如何在开始字符串上添加空格?

2 个答案:

答案 0 :(得分:2)

反斜杠将escape换行符,因此sed将其全部视为一条长行。

在行尾使用双反斜杠以避免这种情况。然后,您可以使用单个反斜杠来转义前导空格。

sed "/hostsection/ a\\
\\
\  server {\\
\    listen 80;\\
\    server_name $1 www.$1;\\
...

答案 1 :(得分:0)

取自https://www.freebsd.org/cgi/man.cgi?query=sed

Multibyte characters containing a byte with value 0x5C (ASCII `\')  may be
     incorrectly treated as line continuation characters in arguments to the
     ``a'', ``c'' and ``i'' commands.  Multibyte characters cannot be used as
     delimiters with the ``s'' and ``y'' commands.

你引用你的sed命令,以便shell可以替换变量,但是bash之类的shell会将“\”解释为行尾处的行继续符。

可能的解决方案 在每行末尾使用\\代替\ 。这种方式bash会解释字面反斜杠,sed会将字面反斜杠理解为换行符。