sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
Spiegazione:
-i
dice a sed di salvare i risultati nel file di input. Senza di esso, sed stamperà i risultati su stdout./central\.database =/
corrisponde alle righe che contengono la stringa tra le barre:central.database =
. Il.
è sfuggito poiché è un carattere speciale in regex.- Il
s/OLD/NEW/
parte esegue un s sostituzione. La stringa OLD è un'espressione regolare da confrontare e ilNEW
part è la stringa in cui sostituire. - Nelle espressioni regolari,
.*
significa "corrisponde a qualsiasi cosa". Quindi= .*
corrisponde a un segno di uguale, uno spazio e qualsiasi altra cosa successiva.
Ecco un esempio di espressione:
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
Se vuoi abbinare cose con /
in esso puoi usare un altro delimitatore:
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
O con espansione variabile:
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
Nel tuo esempio:
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
C'è un \1 prima di $CENTRAL_DB_NAME che non è valido. Inoltre, sed non stampa il suo valore di ritorno. Questo è il modo preferito per controllare i valori restituiti:
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
E infine piping a ssh (non testato):
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
-i serve per sostituire i dati nel file di input. Altrimenti sed scrive su stdout.
Le espressioni regolari sono un campo a sé stante. Sarebbe impossibile spiegarli in modo approfondito in una risposta di StackOverflow, a meno che non ci sia qualche funzione specifica che ti sfugge.