web-dev-qa-db-fra.com

Comment utiliser sed pour remplacer la variable d'un fichier de configuration?

J'ai cherché cette réponse en ligne et je n'arrive pas à la trouver.

J'ai un fichier de configuration qui contient:

VAR1=VALUE1
VAR2=VALUE2
VAR3=VALUE3
VAR4=VALUE4
VAR5=VALUE5
VAR6=VALUE6

Et je veux changer la valeur de VAR5 de VALUE5 à VALUE10. Malheureusement, je ne connais pas la valeur de VALUE5, je ne peux donc pas la rechercher. Donc, fondamentalement, je dois utiliser sed (ou autre) pour remplacer la valeur de VAR5 par la valeur avec laquelle je veux le remplacer.

26
SomeGuyOnAComputer

Vous pouvez essayer ce sed:

sed -i.bak 's/^\(VAR5=\).*/\1VALUE10/' file

Il donne:

VAR1=VALUE1
VAR2=VALUE2
VAR3=VALUE3
VAR4=VALUE4
VAR5=VALUE10
VAR6=VALUE6
43
anubhava

Même si la réponse a été ajoutée à la question. J'ai passé un peu de temps sur son fonctionnement, j'aimerais ajouter quelques faits et ma version de la réponse,

sed -i 's,^\(THISISMYVARIABLE[ ]*=\).*,\1'THISISMYVALUE',g' config.cfg

Explication:

  • En tant que base de sed 's/find_this/replace_with/', Nous disons que sed doit être recherché et remplacé. N'oubliez pas qu'il existe plusieurs autres délimiteurs que nous pouvons utiliser au lieu de /. Ici, , Est utilisé.
  • Ici, nous trouvons la ligne qui correspond à ^\(THISISMYVARIABLE[ ]*=\).*. Cela signifie que nous regroupons la correspondance THISISMYVARIABLE[ ]*=. ([ ]* Pour couvrir s'il y a des espaces après la clé)
  • Dans la section de remplacement \1 Est une référence arrière. Nous référençons le premier groupe de l'expression régulière que nous avons utilisée pour la correspondance.
4
Kannan Ramamoorthy

Tu peux dire:

sed '/^VAR5=/s/=.*/=VALUE10/' filename

Pour effectuer la modification du fichier en place, utilisez le -i option:

sed -i '/^VAR5=/s/=.*/=VALUE10/' filename
3
devnull
sed '/\(^VAR5=\).*/ s//\1VALUE10/' YourFile

Sous AIX/KSH

$ cat sample.txt
VAR1=VALUE1
VAR2=VALUE2
VAR3=VALUE3
VAR4=VALUE4
VAR5=VALUE5
VAR6=VALUE6

$ sed '/\(^VAR5=\).*/ s//\1VALUE10/' sample.txt
VAR1=VALUE1
VAR2=VALUE2
VAR3=VALUE3
VAR4=VALUE4
VAR5=VALUE10
VAR6=VALUE6

et pour le remplacement dans le dossier

cat <> YourFile | sed '/\(^VAR5=\).*/ s//\1VALUE10/'

$ cat <> sample.txt | sed '/\(^VAR5=\).*/ s//\1VALUE10/'
$ cat sample.txt
VAR1=VALUE1
VAR2=VALUE2
VAR3=VALUE3
VAR4=VALUE4
VAR5=VALUE10
VAR6=VALUE6

Pour être conforme à POSIX (sur sed, et non cat) (sed --posix sur gnu sed et nativement traditionnel sed sur système non linux)

1
NeronLeVelu

Essayez ce qui suit

sed -r 's/^ (VAR5 =). */\ 1REPLACEMENT /'

La valeur de VAR5 sera remplacée par REMPLACEMENT.

0
Vlad.Bachurin