用bash替换yml中一行的值

时间:2016-05-18 05:24:16

标签: bash shell yaml

web:
  image: nginx
  volumes:
    - "./app:/src/app"
  ports:
    - "3030:3000"
    - "35729:35729"

我想有一个bash脚本用bash脚本替换nginx参数。

./script apache

将替换nginx

apache

4 个答案:

答案 0 :(得分:11)

您可以使用:sed -r 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: apache/' file

示例运行:

$ cat file
web:
  image: nginx
  volumes:
    - "./app:/src/app"
  ports:
    - "3030:3000"
    - "35729:35729"
$ sed -r 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: apache/' file
web:
  image: apache
  volumes:
    - "./app:/src/app"
  ports:
    - "3030:3000"
    - "35729:35729"

要将更改保留到文件中,您可以使用就地选项,如下所示:

$ sed -ri 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: apache/' file

如果你想在脚本中使用它,你可以将sed命令放在脚本中并用$1替换它来执行它。

$ vim script.sh 
$ cat script.sh 
sed -ri 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: '"$1"'/' file
$ chmod 755 script.sh 
$ cat file 
web:
  image: nginx
  volumes:
    - "./app:/src/app"
  ports:
    - "3030:3000"
    - "35729:35729"
$ ./script.sh apache
$ cat file 
web:
  image: apache
  volumes:
    - "./app:/src/app"
  ports:
    - "3030:3000"
    - "35729:35729"
$

答案 1 :(得分:5)

<强>脚本:

#!/bin/bash
sed -i.bak "s/\bnginx\b/$1/g" file
# \b matches for word boundary
# -i changes the file in-place
# -i.bak produces a backup with .bak extension

现在,您可以使用 apache 执行./script apache替换 nginx

答案 2 :(得分:1)

因为这显然是一个docker-compose文件,你可能想尝试

 image: ${webserver_image}

然后设置:

 webserver_image=[nginx | apache]

发布之前。我相信这应该给你一个很好的插值。

答案 3 :(得分:1)

您可以按如下方式创建script.sh:

#!/bin/bash
# $1 image value you want to replace
# $2 is the file you want to edit
sed -i "" "/^\([[:space:]]*image: \).*/s//\1$1/" $2

然后运行: ./script.sh apache filename.yaml