GNU/Linux >> Linux の 問題 >  >> Linux

柔軟なキーと値を使用して、sed を使用して構成ファイルを変更するにはどうすればよいですか?

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 に書き込みます。

正規表現は独自のフィールドです。あなたを逃している特定の機能がない限り、スタックオーバーフローの回答でそれらを詳細に説明することは不可能です.


Linux
  1. MySQL、PHP、Apacheの設定ファイルを見つける方法

  2. LinuxでSUIDおよびSGID権限を持つファイルを検索する方法

  3. LinuxでSedコマンドを使用する方法と例

  1. Linuxでファイルとディレクトリを圧縮する方法(例付き)

  2. findおよびduコマンドを使用してLinuxで大きなファイルを検索する方法

  3. ファイルを移動して進行状況を表示する方法(例:プログレスバーを使用)?

  1. rsyncを使用してデータ転送でファイルとディレクトリを除外する方法

  2. chownコマンドでファイルとディレクトリの所有権を変更する方法

  3. awkを使用してファイルをインプレースで変更するには? (sed -i と同様)