設定ファイル(fooと呼ばれる)を編集するために、仕様ファイルに%postスクリプトを提供しました。私は"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*??"
等号を探しているようですが? - 末尾のスラッシュの目的は何ですか?
\\\
- 以前の著者が式を括弧で囲んだのはなぜですか
{ }
?
ちなみに、これは上記のスクリプト(fooの場合)と一致するように書き換えたいスクリプト(barの場合)です。
前のバー.groovy
clientSecret:"<ENTER-CLIENTSECRET-HERE>",
バー。グルービーの後
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}.
バックスラッシュは\\\
ステートメントを長い行に導きます。つまり、\n
シェルがスクリプトを読み取ると、次のewline文字をエスケープします。"
二重引用符で囲まれ、そのコンテキストではバックスラッシュが独自にエスケープされるため、3つが必要です。したがって、シェルはエスケープされた改行を取得し、エスケープされたsed
改行を取得します。しかし、この場合シェルは分からないsed
が改行文字が全くエスケープされなくても構わないと思います。