3

私はこの投稿の人と非常によく似た状況にあります。database.yamlファイルに値を入力するスクリプトを作成しようとしています。問題は...解決策として投稿されたその正規表現で何が起こっているのか完全に理解していません。

私がやりたいのは、パスワードの変数を渡すことです。

次のようなデータベースymlファイルがある場合:

development:
  database: sample_development
  password:
  # etc...

test:
  database: sample_test
  password:
  # etc...

次に、「password:」を検出する正規表現を作成して、「password:$ new_password」に置き換えることができるようにするにはどうすればよいですか?

開発パスワードを設定するスクリプトの部分については、正規表現が始まると思います

/^development:

しかし、次の行「パスワード:」を取得する方法がわかりません。

どうすればこれができるのでしょうか?

4

3 に答える 3

3

YAMLライブラリを使用してyamlファイルを読み書きします。

require 'yaml'
database_config = YAML.load(File.open("<some path>/config/database.yml"))

次に、いくつかの値を変更して、fsに書き戻します。

database_config['some_key'] = "some_value"
File.open("<some path>/config/database.yml", "w") {|f| f.write(database_config.to_yaml) }

paramsを受け入れてパスワードやホスト名などを設定するrubyスクリプトを作成できます。これに加えて、YAMLファイル内でrubyを使用して動的にすることができ、yaml自体が構成ファイルまたは環境変数を読み取って使用できます。パスワード、ホスト名などを設定します。

host: <%= SERVER_CONFIG["dev_host"] %>
于 2012-10-07T21:09:53.823 に答える
2

sed スクリプトを使用できます。

#!/bin/sed -f

: restart
/^development/ {
    : loop
    s/\(password:\).*/\1 new_password/
    t stop
    n
    /^[ \t]/ b loop
    i\  password: new_password
    b restart
} 
: stop

ここに、「development」で始まる行が見つかったときにコマンドのメイン ブロックを開始する sed スクリプトがあります。コマンドが何をするかを説明する前に、ラベルについて説明するのは良い考えだと思います。ラベルは:コマンドで定義され、スクリプト内の特定の場所に名前を付けます。3 つのラベルを定義します。

  1. restartスクリプトの先頭に戻るために使用されます。
  2. loopdevelopmentブロック内の行を反復するために使用されます。
  3. stopパスワードの変更を実行したときに使用され、スクリプトの最後に移動します。これにより、実際にはスクリプトを次の入力行で再開できます。

メイン ブロック内で、まずs代替コマンドを使用してパスワードの変更を適用しようとします。動作する場合、次のテスト コマンドはスクリプトの最後にジャンプし、別のブロックが見つかっtた場合に実行を続行できるようにします。development

代替コマンドが成功しない場合、tコマンドは何もせず、次のコマンドを続行しnます。このコマンドは、次の入力行をパターン空間 (つまり、sed の作業バッファー) にロードします。次に、スペースまたはタブで始まるかどうかを確認し、そうである場合は「ループ」ラベルにジャンプして、この新しい行がパスワード フィールドを含む行であるかどうかを確認できるようにします。

空白文字で始まらない場合は、ブロックの終わりに達しています。挿入コマンドはオプションですが、これを使用iすると、見つからない場合にブロックの最後にパスワード行を追加できます。

最後に、ブロックの最後に到達したので、実行を再開する必要があります。実行にスクリプトの最後を読み取らせることもできますが、空白文字で始まらない新しい行をロードしたため、再起動する前に sed が別の行をロードするのを防ぐために手動で先頭にジャンプする必要があります。

次に、このスクリプトを次のように実行できます ( という名前だとchg_passwd.sedします)。

./chg_passwd.sed database.yml

これが役立つことを願っています=)

于 2012-10-07T21:01:22.647 に答える
1

これはあなたのために働くかもしれません:

database=foo newpassword=bar
sed '/^'"${database}"'/,/^\s*$/s/password:/&'"${newpassword}"'/' file
于 2012-10-07T23:55:05.417 に答える