sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
Explicación:
-i
le dice a sed que guarde los resultados en el archivo de entrada. Sin él, sed imprimirá los resultados en la salida estándar./central\.database =/
coincide con las líneas que contienen la cadena entre barras:central.database =
. El.
se escapa ya que es un carácter especial en expresiones regulares.- El
s/OLD/NEW/
parte realiza un s sustitución La cadena OLD es una expresión regular para hacer coincidir y elNEW
parte es la cadena a sustituir. - En expresiones regulares,
.*
significa "coincidir con cualquier cosa". Entonces= .*
coincide con un signo igual, un espacio y luego cualquier otra cosa.
Aquí hay una expresión de ejemplo:
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
Si quieres hacer coincidir cosas con /
en él, puede usar otro delimitador:
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
O con expansión variable:
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
En tu ejemplo:
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
Hay un \1 antes de $CENTRAL_DB_NAME que no es válido. Además, sed no imprime su valor de retorno. Esta es la forma preferida de comprobar los valores devueltos:
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
Y finalmente canalizar a ssh (no probado):
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
El -i es para reemplazar datos en el archivo de entrada. De lo contrario, sed escribe en stdout.
Las expresiones regulares son un campo propio. Sería imposible explicarlos en profundidad en una respuesta de stackoverflow, a menos que haya alguna función específica que se te escape.