O que essa expressão regular faz?

1

Eu recebi um% post script dentro de um arquivo de especificações para editar um arquivo de configuração (chamado foo). Eu tenho a tarefa de escrever outro script, quase idêntico, para editar um arquivo chamado 'bar'.

Embora minha solução para 'bar' funcione tecnicamente, ela é dramaticamente diferente semanticamente. O zelador está solicitando que eu o reescreva por coerência.

foo.groovy antes

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

foo.groovy após

messageQueue.secretKey = "y775hUYKR1Bm4gUWNRbzqg65"

O script que me é dado é o seguinte:

%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

O que estou tentando descobrir:

  1. O que essa regex faz? s?^//\s*??" Eu suponho que ele esteja procurando por um sinal de igual?
  2. Qual é o propósito das barras à direita? %código%
  3. Por que o autor anterior cercou a expressão entre colchetes \\ ?

Para referência, aqui está o meu script (para bar), que estou tentando reescrever para corresponder ao script acima (for foo)

bar.groovy antes

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

bar.groovy após

clientSecret:"4gUWNRbzqg65y775hUYKR1Bm",

script 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
    
por spuder 17.06.2014 / 20:13

2 respostas

2

Em qualquer linha que contenha a string messageQueue.secretKey , remove a string // e os espaços que se seguem, se existirem no início da linha, e substitui a primeira ocorrência de <ENTER-KEY-HERE> pelo conteúdo da variável% do shell código%. Os curlies ${MESSAGEQUEUESECRETKEY} limitam as remoções / substituições para as linhas somente que contêm a string { . Estas operações são realizadas no arquivo referenciado pela variável shell messageQueue.secretKey

As barras invertidas ${config_file}. continuam a declaração em uma linha longa - escapando do caractere \\ ewline imediatamente após o script ser lido pelo shell. Três são necessárias porque elas estão contidas em \n aspas duplas e a barra invertida se escapa nesse contexto. Portanto, o shell recebe uma nova linha de escape e " obtém uma nova linha de escape. Embora, embora eu não saiba sobre o shell neste contexto, eu não acredito que sed se importaria se as novas linhas não tivessem escapado de nenhuma maneira.

    
por 17.06.2014 / 20:24
1
  1. O que essa regex faz? s?^//\s*??"

Remova o // e todos os espaços após o início da linha nas linhas que contêm messageQueue.secretKey com:

  • o ponto de interrogação ? como o delimitador de padrões
  • ^ corresponde ao início de uma linha
  • // corresponde exatamente a isso (em uma nota lateral é a razão para usar o ponto de interrogação como o delimitador de padrão em vez do mais comum / , o que evita um pouco de escape porque, caso contrário, o regex seria s/^\/\/\s*//
  • \s* é específico do GNU sed para corresponder ou mais espaços em branco space e / ou Tab ; POSIX sed usaria [:space:]

E a @mikeserv acaba de postar uma resposta ainda mais abrangente ...

    
por 17.06.2014 / 20:46

Tags