구성 파일(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}
{
오직string 을 포함하는 라인 messageQueue.secretKey
. 이러한 작업은 쉘 변수가 참조하는 파일에서 수행됩니다.${config_file}.
백슬래시는 \\\
명령문을 긴 줄로 이어갑니다. 즉, \n
쉘이 스크립트를 읽을 때 다음 ewline 문자를 이스케이프 처리합니다. "
큰따옴표로 묶여 있고 해당 컨텍스트에서 백슬래시가 자체적으로 이스케이프되므로 세 개가 필요합니다 . 따라서 쉘은 이스케이프된 개행을 얻고 sed
이스케이프된 개행을 얻습니다. 그러나 이 경우 쉘은 모르지만 sed
개행 문자가 전혀 이스케이프되지 않아도 상관없다고 생각합니다.
답변2
- 이 정규식은 무엇을 합니까?
s?^//\s*??"
//
messageQueue.secretKey가 포함된 줄 시작 부분과 뒤의 공백을 모두 제거하세요 .
?
패턴 구분 기호인 물음표^
줄의 시작과 일치합니다.//
정확한 일치(그런데 더 일반적인 것 대신에 물음표를 패턴 구분 기호로 사용하는 이유이므로/
이스케이프가 상당히 방지됩니다. 그렇지 않으면 정규식은 다음과 같습니다.s/^\/\/\s*//
\s*
GNU sed는 일치 또는 다중 공백 space및/또는 TabPOSIX sed에 적용됩니다.[:space:]
@mikeserv가 좀 더 포괄적인 답변을 게시했습니다...