sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
Penjelasan:
-i
memberitahu sed untuk menyimpan hasilnya ke file input. Tanpanya sed akan mencetak hasilnya ke stdout./central\.database =/
mencocokkan baris yang berisi string di antara garis miring:central.database =
..
diloloskan karena merupakan karakter khusus di regex.s/OLD/NEW/
bagian melakukan s penggantian. String OLD adalah ekspresi reguler untuk mencocokkan danNEW
part adalah string yang akan diganti.- Dalam ekspresi reguler,
.*
berarti "cocok dengan apa saja". Jadi= .*
cocok dengan tanda sama dengan, spasi, lalu apa saja setelahnya.
Berikut adalah contoh ekspresi:
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
Jika Anda ingin mencocokkan barang dengan /
di dalamnya, Anda dapat menggunakan pembatas lain:
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
Atau dengan perluasan variabel:
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
Dalam contoh Anda:
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
Ada \1 sebelum $CENTRAL_DB_NAME yang tidak valid. Juga, sed tidak mencetak nilai pengembaliannya. Ini adalah cara yang lebih disukai untuk memeriksa nilai kembalian:
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
Dan akhirnya menyalurkan ke ssh (tidak diuji):
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
-i adalah untuk mengganti data dalam file input. Kalau tidak, sed menulis ke stdout.
Ekspresi reguler adalah bidangnya sendiri. Tidak mungkin untuk menjelaskannya secara mendalam dalam jawaban stackoverflow, kecuali ada beberapa fungsi tertentu yang menghindari Anda.