sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
Erklärung:
-i
weist sed an, die Ergebnisse in der Eingabedatei zu speichern. Ohne es wird sed die Ergebnisse auf stdout ausgeben./central\.database =/
entspricht Zeilen, die die Zeichenfolge zwischen Schrägstrichen enthalten:central.database =
. Die.
wird maskiert, da es sich um ein Sonderzeichen in Regex handelt.- Die
s/OLD/NEW/
Teil führt ein s aus Ersatz. Der OLD-String ist ein regulärer Ausdruck zum Abgleichen und derNEW
part ist die zu ersetzende Zeichenkette. - In regulären Ausdrücken
.*
bedeutet "mit allem übereinstimmen". Also= .*
entspricht einem Gleichheitszeichen, einem Leerzeichen und danach irgendetwas anderem.
Hier ist ein Beispielausdruck:
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
Wenn Sie Inhalte mit /
abgleichen möchten darin können Sie ein anderes Trennzeichen verwenden:
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
Oder mit variabler Erweiterung:
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
In Ihrem Beispiel:
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
Vor $CENTRAL_DB_NAME steht ein ungültiges \1. Außerdem gibt sed seinen Rückgabewert nicht aus. Dies ist die bevorzugte Methode, um Rückgabewerte zu überprüfen:
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
Und schließlich die Weiterleitung an ssh (nicht getestet):
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
Das -i dient zum Ersetzen von Daten in der Eingabedatei. Andernfalls schreibt sed nach stdout.
Reguläre Ausdrücke sind ein eigenes Feld. Es wäre unmöglich, sie in einer Stackoverflow-Antwort ausführlich zu erklären, es sei denn, es gibt eine bestimmte Funktion, die sich Ihnen entzieht.