Sed regex para uma palavra variável no Ubuntu 14

Sed regex para uma palavra variável no Ubuntu 14

Dado um arquivo com a seguinte string:

fastcgi_param WP_ENV staging;

Preciso de uma expressão sed que substitua a palavra 'staging' por uma nova string:

fastcgi_param WP_ENV production;

No primeiro exemplo, a terceira palavra é variável. Pode ser qualquer string minúscula, por exemplo, desenvolvimento, local, etc.

Eu tentei o seguinte:

sed  's/fastcgi_param WP_ENV [\w+]/fastcgi_param WP_ENV production/g' 

mas não pega o trabalho corretamente. O regexp para a palavra não corresponde.

Qual seria o comando sed correto para fazer esse tipo de substituição?

Responder1

Adicione -Ee remova os colchetes:

$ sed -E 's/fastcgi_param WP_ENV \w+/fastcgi_param WP_ENV production/g' file
fastcgi_param WP_ENV production;

Notas:

  1. +não é compatível com expressões regulares básicas. -Eativa o regex estendido que suporta +.

  2. \w+corresponde a um ou mais caracteres de palavra. [\w+]corresponde a qualquer um de \, w, ou +.

  3. \wnão é portátil. Para compatibilidade com POSIX, use:

    $ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file
    fastcgi_param WP_ENV production;
    
  4. Você pode evitar a digitação dupla da linha usando um grupo de captura:

    $ sed -E 's/(fastcgi_param WP_ENV) [[:alnum:]]+/\1 production/g' file
    fastcgi_param WP_ENV production;
    

Responder2

Fazer:

sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/'
  • ^(([^[:blank:]]+[[:blank:]]+){2})corresponde às duas primeiras palavras e coloca-as no grupo capturado para que possamos referir o grupo na substituição

  • [[:lower:]]+corresponde a um ou mais caracteres minúsculos

  • (.*)corresponde à parte restante da linha e coloca no grupo capturado

  • Na substituição, mantivemos o grupo capturado, 1 (duas primeiras palavras com espaço em branco à direita) e 3 (parte após as letras minúsculas desejadas a serem substituídas). Entre estes, a string de substituição desejada é fornecida.

Exemplo:

% sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/' <<<'fastcgi_param WP_ENV staging;'
fastcgi_param WP_ENV production;

informação relacionada