shell脚本中sed命令如何使用变量
在shell脚本中我们常常需要使用sed命令进行配置文件的更新,但是更新的内容又往往根据环境相关。值并不是固定的。
这里我们介绍一种在sed命令中使用变量的方法。
比如,在nginx的配置中,我们需要根据环境来更新/etc/nginx/sites-available/default中的目录配置。
通常我们采用一个变量,来记录当前环境需要配置的目录比如:
dist_dir=/home/dev/code/ui/dist
这个目录也是index.html文件所在的目录。
需要在/etc/nginx/sites-available/default文件中更新此目录,方法如下:
#!/usr/bin/env bash
set -eu
set -o pipefail
dist_dir=/home/dev/code/ui/dist
string_command="s!^ *root .*;! root ${dist_dir};!"
sed -i "$string_command" /etc/nginx/sites-available/default
这里说明如下:
- 因为文件中还有匹配root的其它行,因此使用^ *root .*来匹配以零个或多个空格开始,接着是root字符串,后面跟任意字符序列的行,这样就能匹配到一个目标行
- 因为变量中包含/ 这里使用不会遇到!来替换默认的/作为分隔符
这里本来想写成一个语句,类似
sed -i '' 's/^ *root .*/ root "${dist_dir}";/' /etc/nginx/sites-available/default
的形式,尝试了多种手段,不是报错就是执行效果总是与预期不一致,原因可能在于sed命令是硬编码,具体原因不详,有知道的大神请指教!!
因此拆成2个语句进行实现,如果您有更好的方法,欢迎评论。