¿Qué hace esta expresión regular?

¿Qué hace esta expresión regular?

Me proporcionaron un script %post dentro de un archivo de especificaciones para editar un archivo de configuración (llamado foo). Me han encomendado la tarea de escribir otro script casi idéntico para editar un archivo llamado "barra".

Si bien mi solución para 'barra' técnicamente funciona, es dramáticamente diferente semánticamente. El custodio me solicita que lo reescriba para mantener la coherencia.

foo.groovy antes

messageQueue.secretKey = "<ENTER-KEY-HERE>" 

foo.groovy después

messageQueue.secretKey = "y775hUYKR1Bm4gUWNRbzqg65"

El script que me dieron es el siguiente:

%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

Lo que estoy tratando de resolver:

  1. ¿Qué hace esta expresión regular? s?^//\s*??"¿Supongo que está buscando un signo igual?
  2. ¿Cuál es el propósito de las barras diagonales?\\\
  3. ¿Por qué el autor anterior puso la expresión entre paréntesis { }?

Como referencia, aquí está mi script (para bar), que estoy intentando reescribir para que coincida con el script anterior (para foo)

bar.groovy antes

clientSecret:"<ENTER-CLIENTSECRET-HERE>",

bar.groovy después

clientSecret:"4gUWNRbzqg65y775hUYKR1Bm",

guión de barra

%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

Respuesta1

En cualquier línea que contenga la cadena, messageQueue.secretKeyelimina la cadena //y los espacios que siguen si existe al inicio de la línea y reemplaza la primera aparición de <ENTER-KEY-HERE>con el contenido de la variable de shell ${MESSAGEQUEUESECRETKEY}. Los {curlies limitan las eliminaciones/reemplazos asololíneas que contienen la cadena messageQueue.secretKey. Estas operaciones se realizan en el archivo al que hace referencia la variable de shell.${config_file}.

Las \\\barras invertidas continúan la declaración en una línea larga, escapando del \ncarácter de línea ew inmediatamente siguiente cuando el shell lee el script. Tres son necesarios porque están contenidos entre "comillas dobles y la barra invertida se escapa en ese contexto. Entonces el shell obtiene una nueva línea de escape y seduna nueva línea de escape. Sin embargo, aunque no conozco el shell en este contexto, no creo que sedme importe si las nuevas líneas no se escaparon de todos modos.

Respuesta2

  1. ¿Qué hace esta expresión regular?s?^//\s*??"

Elimine los //espacios siguientes y los siguientes desde la línea que comienza en las líneas que contienen messageQueue.secretKey con:

  • El signo de interrogación ?como delimitador del patrón.
  • ^coincide con el comienzo de una línea
  • //coincide exactamente con eso (en una nota al margen, esa es la razón para usar el signo de interrogación como delimitador de patrón en lugar del más común, /lo que evita bastante escape porque de lo contrario la expresión regular serías/^\/\/\s*//
  • \s*es GNU sed específico para hacer coincidir o más espacios en blanco spacey/o Tab; POSIX sed usaría[:space:]

Y @mikeserv acaba de publicar una respuesta aún más completa...

información relacionada