구성 파일(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
내가 알아내려고 하는 것:
- 이 정규식은 무엇을 합니까?
s?^//\s*??"
등호를 찾고 있다고 가정합니까? - 후행 슬래시의 목적은 무엇입니까?
\\\
- 이전 저자가 해당 표현을 괄호로 묶은 이유는 무엇입니까
{ }
?
참고로 여기에 내 스크립트(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
- 이 정규식은 무엇을 합니까?
s?^//\s*??"
//
messageQueue.secretKey가 포함된 줄의 시작 줄에서 다음과 같은 공백을 제거합니다 .
?
패턴 구분 기호인 물음표^
줄의 시작과 일치합니다//
정확히 일치합니다(참고로 물음표를 더 일반적인 패턴 구분 기호로 사용하는 이유는/
그렇지 않으면 정규식이 다음과 같기 때문에 상당한 이스케이프를 방지합니다.s/^\/\/\s*//
\s*
GNU sed는 하나 이상의 공백 space및/또는 일치하도록 특정되어 있습니다 Tab. POSIX sed는 다음을 사용합니다.[:space:]
그리고 @mikeserv는 훨씬 더 포괄적인 답변을 게시했습니다...