sed -i -e '/central\.database =/ s/= .*/= new_value/' /path/to/file
説明:
-i
結果を入力ファイルに保存するようにsedに指示します。これがないと、sed は結果を stdout に出力します。/central\.database =/
スラッシュの間に文字列を含む行に一致します:central.database =
..
は正規表現の特殊文字であるため、エスケープされます。s/OLD/NEW/
一部は s を実行します 代用。 OLD 文字列は一致する正規表現で、NEW
は part は置換する文字列です。- 正規表現では
.*
「何にでも合う」という意味です。だから= .*
等号、スペース、およびその後に続くその他すべてに一致します。
式の例を次に示します:
sed -i 's/^\(central\.database\s*=\s*\).*$/\1SQLTEST/' file.cfg
/
と一致させたい場合 その中で、別の区切り文字を使用できます:
sed -i 's#^\(cent/ral\.data/base\s*=\s*\).*$#\1SQL/TEST#' file.cfg
または変数展開:
VAL="SQLTEST"
sed -i "s/^\(central\.database\s*=\s*\).*\$/\1$VAL/" file.cfg
あなたの例では:
sshRetValue=`sed -i "s/^\(\1$CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt`;
$CENTRAL_DB_NAME の前に無効な \1 があります。また、sed は戻り値を出力しません。これは、戻り値を確認するための推奨される方法です:
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
sed_return_value=$?
そして最終的に ssh にパイプします (未テスト):
sed_return_value=$(ssh server <<EOF
sed -i "s/^\($CENTRAL_DB_NAME\s*=\s*\).*\$/\1$CENTRAL_DB_VALUE/" /home/testing.txt;
echo $?
EOF
)
-i は、入力ファイル内のデータを置き換えるためのものです。それ以外の場合、sed は stdout に書き込みます。
正規表現は独自のフィールドです。あなたを逃している特定の機能がない限り、スタックオーバーフローの回答でそれらを詳細に説明することは不可能です.