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 つのラベルを定義します。
restart
スクリプトの先頭に戻るために使用されます。
loop
development
ブロック内の行を反復するために使用されます。
stop
パスワードの変更を実行したときに使用され、スクリプトの最後に移動します。これにより、実際にはスクリプトを次の入力行で再開できます。
メイン ブロック内で、まずs
代替コマンドを使用してパスワードの変更を適用しようとします。動作する場合、次のテスト コマンドはスクリプトの最後にジャンプし、別のブロックが見つかっt
た場合に実行を続行できるようにします。development
代替コマンドが成功しない場合、t
コマンドは何もせず、次のコマンドを続行しn
ます。このコマンドは、次の入力行をパターン空間 (つまり、sed の作業バッファー) にロードします。次に、スペースまたはタブで始まるかどうかを確認し、そうである場合は「ループ」ラベルにジャンプして、この新しい行がパスワード フィールドを含む行であるかどうかを確認できるようにします。
空白文字で始まらない場合は、ブロックの終わりに達しています。挿入コマンドはオプションですが、これを使用i
すると、見つからない場合にブロックの最後にパスワード行を追加できます。
最後に、ブロックの最後に到達したので、実行を再開する必要があります。実行にスクリプトの最後を読み取らせることもできますが、空白文字で始まらない新しい行をロードしたため、再起動する前に sed が別の行をロードするのを防ぐために手動で先頭にジャンプする必要があります。
次に、このスクリプトを次のように実行できます ( という名前だとchg_passwd.sed
します)。
./chg_passwd.sed database.yml
これが役立つことを願っています=)