C'est en fait assez simple avec sed
:si une ligne correspond, copiez-la simplement dans le h
ancien espace puis s
remplacer la valeur.
Sur la route$
t ligne ex
changez l'espace de maintien et l'espace de motif puis vérifiez si ce dernier est vide. S'il n'est pas vide, cela signifie que la substitution a déjà été effectuée, donc rien à faire. S'il est vide, cela signifie qu'aucune correspondance n'a été trouvée. Remplacez donc l'espace de modèle par la variable=value souhaitée. puis ajouter à la ligne actuelle dans le tampon de maintien. Enfin, ex
modifier à nouveau :
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Ce qui précède est gnu sed
syntaxe. Portatif :
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile
Cela peut probablement être raccourci. Ce n'est pas une seule commande sed et elle utilise également grep, mais cela semble être essentiellement ce que vous voulez. C'est une seule ligne, et il édite le fichier sur place (pas de fichiers temporaires).
grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file ||
sed "$ a\FOOBAR=newvalue" -i file
Voici un sed
plus simple approche, car je ne trouve pas sed
hold space
facile à travailler. Si vous êtes à l'aise avec hold space
, l'utilisation de l'approche don_crissti offre une possibilité supplémentaire de préserver quoi que ce soit de la ligne existante, mais cela est généralement très rare.
Dans cette approche, vous imprimez tout sauf la ligne que vous souhaitez supprimer, puis à la fin, ajoutez le remplacement.
sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile