web-dev-qa-db-fra.com

Remplacer la valeur d'une ligne dans un yml avec bash

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

Je voudrais avoir un script bash pour remplacer le nginx pour un argument avec le script bash.

./script Apache

Remplacera nginx pour Apache

8
Ivan Santos

Vous pouvez utiliser ceci: sed -r 's/^(\s*)(image\s*:\s*nginx\s*$)/\1image: Apache/' file

Échantillon échantillon:

$ 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"

Pour conserver les modifications dans le fichier, vous pouvez utiliser une option sur place comme ceci:

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

Si vous le souhaitez dans un script, vous pouvez simplement insérer la commande sed dans un script et l'exécuter avec $1 en substitution.

$ 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"
$
8
ritesht93

script:

#!/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

Maintenant, vous pouvez faire ./script Apache pour remplacer nginx avec Apache .

5
Jahid

puisque c’est apparemment un fichier docker-composé, vous voudrez peut-être essayer

 image: ${webserver_image}

puis définissez:

 webserver_image=[nginx | Apache]

avant de lancer. Je crois que cela devrait vous donner une interpolation de Nice.

1
rmalchow

Vous pouvez créer votre script.sh comme suit:

#!/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

Et puis lancez: ./script.sh Apache filename.yaml

0
flowinh2o