Sed regex para uma palavra variável no Ubuntu 14

2

Dado um arquivo com a seguinte string:

fastcgi_param WP_ENV staging;

Eu 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 em minúsculas, 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 da palavra não corresponde.

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

    
por Rodrigo M 27.09.2016 / 01:25

2 respostas

5

Adicione -E e 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 é suportado em expressões regulares básicas. -E ativa o regex estendido, que suporta + .

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

  3. \w não é portátil. Para compatibilidade 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 dupla digitação da linha usando um grupo de captura:

    $ sed -E 's/(fastcgi_param WP_ENV) [[:alnum:]]+/ production/g' file
    fastcgi_param WP_ENV production;
    
por 27.09.2016 / 01:30
2

Faça:

sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/production/'
  • ^(([^[:blank:]]+[[:blank:]]+){2}) corresponde as duas primeiras palavras e as coloca no grupo capturado para que possamos nos referir ao 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 (primeiras duas palavras com espaços em branco à direita) e 3 (parte após as minúsculas desejadas a serem substituídas). Entre estes, a cadeia de substituição desejada é fornecida.

Exemplo:

% sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/production/' <<<'fastcgi_param WP_ENV staging;'
fastcgi_param WP_ENV production;
    
por 27.09.2016 / 01:34