sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
Vysvětlení:
-i
řekne sed, aby uložil výsledky do vstupního souboru. Bez něj sed vytiskne výsledky do stdout./central\.database =/
odpovídá řádkům, které obsahují řetězec mezi lomítky:central.database =
..
je escapováno, protože jde o speciální znak v regulárním výrazu.s/OLD/NEW/
část provede s substituce. Řetězec OLD je regulární výraz pro shodu aNEW
část je řetězec, do kterého se má dosadit.- V regulárních výrazech
.*
znamená „shodovat se s čímkoli“. Takže= .*
odpovídá rovnítko, mezeru a potom cokoli dalšího.
Zde je příklad výrazu:
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
Pokud chcete porovnat věci s /
v něm můžete použít jiný oddělovač:
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
Nebo s variabilním rozšířením:
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
Ve vašem příkladu:
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
Před $CENTRAL_DB_NAME je \1 neplatný. Také sed nevytiskne svou návratovou hodnotu. Toto je preferovaný způsob kontroly návratových hodnot:
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
A nakonec připojení k ssh (netestováno):
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
-i slouží k nahrazení dat ve vstupním souboru. Jinak sed zapisuje do stdout.
Regulární výrazy jsou vlastní pole. Bylo by nemožné je do hloubky vysvětlit v odpovědi stackoverflow, pokud neexistuje nějaká konkrétní funkce, která vám uniká.