設定ファイル (foo という名前) を編集するための %post スクリプトが仕様ファイル内に提供されています。私は、'bar' というファイルを編集するための、ほぼ同じスクリプトをもう 1 つ作成するように指示されました。
「bar」に対する私の解決策は技術的には機能しますが、意味的に大きく異なります。管理者は一貫性を保つために書き直すように要求しています。
foo.groovy 以前
messageQueue.secretKey = "<ENTER-KEY-HERE>"
foo.groovyの後
messageQueue.secretKey = "y775hUYKR1Bm4gUWNRbzqg65"
私に与えられたスクリプトは次のとおりです。
%define oauth_client_Secret \
echo " Setting the message queue secret key..." \
MESSAGEQUEUESECRETKEY=`dd if=/dev/urandom count=16 bs=1 2>/dev/null | base64` \
for config_file in `find /opt/foo/etc -name *.groovy` \
do \
sed -i -e "/messageQueue.secretKey/ { " \\\
-e " s?^//\s*??" \\\
-e " s?<ENTER-KEY-HERE>?${MESSAGEQUEUESECRETKEY}?" \\\
-e "}" \\\
${config_file} \
done
私が理解しようとしていること:
- この正規表現は何をしますか?
s?^//\s*??"
等号を探しているのでしょうか? - 末尾のスラッシュの目的は何ですか?
\\\
- 前の著者はなぜ表現を括弧で囲んだのでしょうか
{ }
?
参考までに、これは私のスクリプト(bar用)です。これを上記のスクリプト(foo用)と一致するように書き直そうとしています。
bar.groovy 以前
clientSecret:"<ENTER-CLIENTSECRET-HERE>",
bar.groovy 後
clientSecret:"4gUWNRbzqg65y775hUYKR1Bm",
バースクリプト
%define oauth_client_Secret \
echo " Generating oauth clientSecret..." \
MESSAGEQUEUESECRETKEY=`dd if=/dev/urandom count=16 bs=1 2>/dev/null | base64` \
for config_file in `find /opt/bar/etc -name *.groovy` \
do \
sed -i "s/<ENTER-CLIENTSECRET-HERE>/${MESSAGEQUEUESECRETKEY}/g" ${config_file} \
done
答え1
文字列を含む行では、行の先頭にmessageQueue.secretKey
文字列とそれに続くスペースがある場合は削除し、最初に出現する文字列をシェル変数の内容に置き換えます。//
<ENTER-KEY-HERE>
${MESSAGEQUEUESECRETKEY}
{
中括弧は削除/置換を次の範囲に限定します。のみ文字列を含む行messageQueue.secretKey
。これらの操作は、シェル変数によって参照されるファイルに対して実行されます。${config_file}.
バック\\\
スラッシュは、ステートメントを 1 つの長い行に継続します。\n
スクリプトがシェルによって読み込まれるときに、直後の ewline 文字をエスケープします。3 つ必要なのは、それらが"
二重引用符内に含まれ、そのコンテキストでバックスラッシュ自体をエスケープするためです。したがって、シェルは 1 つのエスケープされた改行を取得し、sed
1 つのエスケープされた改行を取得します。ただし、このコンテキストでのシェルについてはわかりませんが、sed
いずれにしても改行がまったくエスケープされなくても気にしないと思います。
答え2
- この正規表現は何をするのでしょうか?
s?^//\s*??"
//
次のように、messageQueue.secretKey を含む行の行頭から とそれに続くスペースを削除します。
?
パターン区切り文字としての疑問符^
行の先頭に一致する//
正確に一致します(余談ですが、これがパターン区切り文字として、より一般的な疑問符ではなく疑問符を使用する理由です。/
そうしないと、正規表現がs/^\/\/\s*//
\s*
GNU sedは、またはまたはそれ以上の空白spaceと/またはTab;に一致するように特別に設計されていますPOSIX sedは、[:space:]
そして、@mikeserv はさらに包括的な回答を投稿しました...