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

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

구성 파일(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

내가 알아내려고 하는 것은 다음과 같습니다.

  1. 이 정규식은 무엇을 합니까? s?^//\s*??"등호를 찾고 있는 것 같은데요?
  2. 후행 슬래시의 목적은 무엇입니까?\\\
  3. 이전 저자가 표현식을 괄호로 묶은 이유는 무엇입니까 { }?

참고로 이것은 위의 스크립트(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

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

//messageQueue.secretKey가 포함된 줄 시작 부분과 뒤의 공백을 모두 제거하세요 .

  • ?패턴 구분 기호인 물음표
  • ^줄의 시작과 일치합니다.
  • //정확한 일치(그런데 더 일반적인 것 대신에 물음표를 패턴 구분 기호로 사용하는 이유이므로 /이스케이프가 상당히 방지됩니다. 그렇지 않으면 정규식은 다음과 같습니다.s/^\/\/\s*//
  • \s*GNU sed는 일치 또는 다중 공백 space및/또는 TabPOSIX sed에 적용됩니다.[:space:]

@mikeserv가 좀 더 포괄적인 답변을 게시했습니다...

관련 정보