この正規表現は何をするのでしょうか?

この正規表現は何をするのでしょうか?

設定ファイル (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

私が理解しようとしていること:

  1. この正規表現は何をしますか?s?^//\s*??"等号を探しているのでしょうか?
  2. 末尾のスラッシュの目的は何ですか?\\\
  3. 前の著者はなぜ表現を括弧で囲んだのでしょうか{ }?

参考までに、これは私のスクリプト(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 つのエスケープされた改行を取得し、sed1 つのエスケープされた改行を取得します。ただし、このコンテキストでのシェルについてはわかりませんが、sedいずれにしても改行がまったくエスケープされなくても気にしないと思います。

答え2

  1. この正規表現は何をするのでしょうか?s?^//\s*??"

//次のように、messageQueue.secretKey を含む行の行頭から とそれに続くスペースを削除します。

  • ?パターン区切り文字としての疑問符
  • ^行の先頭に一致する
  • //正確に一致します(余談ですが、これがパターン区切り文字として、より一般的な疑問符ではなく疑問符を使用する理由です。/そうしないと、正規表現がs/^\/\/\s*//
  • \s*GNU sedは、またはまたはそれ以上の空白spaceと/またはTab;に一致するように特別に設計されていますPOSIX sedは、[:space:]

そして、@mikeserv はさらに包括的な回答を投稿しました...

関連情報