Что делает это регулярное выражение?

Что делает это регулярное выражение?

Мне предоставили %post-скрипт внутри spec-файла для редактирования конфигурационного файла (называемого foo). Мне поручили написать еще один, почти идентичный скрипт для редактирования файла под названием '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 только что опубликовал еще более подробный ответ...

Связанный контент