sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
Explication :
-i
indique à sed d'enregistrer les résultats dans le fichier d'entrée. Sans cela, sed imprimera les résultats sur stdout./central\.database =/
correspond aux lignes contenant la chaîne entre barres obliques :central.database =
. Le.
est échappé puisqu'il s'agit d'un caractère spécial dans regex.- Le
s/OLD/NEW/
la pièce effectue un s substitution. La chaîne OLD est une expression régulière à faire correspondre et leNEW
part est la chaîne à remplacer. - Dans les expressions régulières,
.*
signifie "correspondre à n'importe quoi". Alors= .*
correspond à un signe égal, à un espace, puis à n'importe quoi d'autre après.
Voici un exemple d'expression :
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
Si vous voulez faire correspondre des choses avec /
dedans, vous pouvez utiliser un autre délimiteur :
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
Ou à expansion variable :
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
Dans votre exemple :
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
Il y a un \1 avant $CENTRAL_DB_NAME qui n'est pas valide. De plus, sed n'imprime pas sa valeur de retour. Il s'agit de la méthode préférée pour vérifier les valeurs de retour :
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
Et finalement rediriger vers ssh (non testé) :
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
Le -i sert à remplacer les données dans le fichier d'entrée. Sinon, sed écrit sur stdout.
Les expressions régulières sont un domaine à part entière. Il serait impossible de les expliquer en profondeur dans une réponse stackoverflow, à moins qu'il y ait une fonction spécifique qui vous échappe.