이 정규식은 무엇을 합니까?

이 정규식은 무엇을 합니까?

구성 파일(foo라고 함)을 편집하기 위해 사양 파일 내에 %post 스크립트가 제공되었습니다. 나는 'bar'라는 파일을 편집하기 위해 거의 동일한 또 다른 스크립트를 작성하는 임무를 받았습니다.

'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>",

바.그루비 이후

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 문자를 이스케이프 처리합니다. "큰따옴표 안에 포함되어 있고 해당 컨텍스트에서 백슬래시가 자체적으로 이스케이프되므로 세 개가 필요합니다 . 따라서 쉘은 하나의 이스케이프된 개행 문자를 얻고 sed하나의 이스케이프된 개행 문자를 얻습니다. 하지만 이 맥락에서 쉘에 대해서는 모르지만 sed어쨌든 개행 문자가 전혀 이스케이프되지 않았더라도 상관하지 않을 것이라고 생각합니다.

답변2

  1. 이 정규식은 무엇을 합니까?s?^//\s*??"

//messageQueue.secretKey가 포함된 줄의 시작 줄에서 다음과 같은 공백을 제거합니다 .

  • ?패턴 구분 기호인 물음표
  • ^줄의 시작과 일치합니다
  • //정확히 일치합니다(참고로 물음표를 더 일반적인 패턴 구분 기호로 사용하는 이유는 /그렇지 않으면 정규식이 다음과 같기 때문에 상당한 이스케이프를 방지합니다.s/^\/\/\s*//
  • \s*GNU sed는 하나 이상의 공백 space및/또는 일치하도록 특정되어 있습니다 Tab. POSIX sed는 다음을 사용합니다.[:space:]

그리고 @mikeserv는 훨씬 더 포괄적인 답변을 게시했습니다...

관련 정보