即使使用转义字符,在sed中添加一行也不起作用

时间:2017-03-31 13:10:48

标签: bash sed

我正在尝试在Vagrant中使用Bash脚本来自动设置ELK堆栈。其中一个nginx配置文件需要适量的缩进。

我试过了:

sudo sed -i '28 a \ \ \ \ \ \ \ \ auth_basic_user_file /etc/nginx/htpasswd.users;' /etc/nginx/sites-available/default

它应该附加一个距离边距8个空格的行,并且在我需要它的位置,但是当我检查配置文件时,不会添加空格。

我已成功使用:

sudo sed -i '73 a \ \ \ \ bika.lims' /usr/local/Plone/zeocluster/buildout.cfg

之前的另一个项目,它添加了正确的空格数。 我这次做错了吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以从第28行获取缩进,并在添加新行时使用它。

例如,在第28行的/ etc / nginx / sites-available / default中 像这样的东西:

    # include snippets/snakeoil.conf;

然后你可以这样做:

sudo sed -i 's,^\([[:space:]]*\).*include snippets/snakeoil.conf.*,&\n\1auth_basic_user_file /etc/nginx/htpasswd.users,' /etc/nginx/sites-available/default
  1. 在替换命令s/regexp/replacement/中使用逗号作为分隔符s,regexp,replacement,。在regexp中引用/是有帮助的。
  2. ^\([[:space:]]*\).*include snippets/snakeoil.conf.*正则表达式与# include snippets/snakeoil.conf;

    匹配

    2.1 ^\([[:space:]]*\)匹配子表达式组\(\)。从行首开始匹配所有空格。现在它可以引用特殊的转义\1(参见步骤3.3)。

  3. &\n\1auth_basic_user_file /etc/nginx/htpasswd.users这将被替换。

    3.1 & - 特殊字符&指代匹配的模式空间的那部分。所以它只是保留旧线 # include snippets/snakeoil.conf;就位。

    3.2 \n - 新行

    3.3 \1 - 特殊转义\1以引用步骤2.1中的子表达式

    3.4 auth_basic_user_file /etc/nginx/htpasswd.users - 说明需要添加的内容