
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 -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:
+
não é compatível com expressões regulares básicas.-E
ativa o regex estendido que suporta+
.\w+
corresponde a um ou mais caracteres de palavra.[\w+]
corresponde a qualquer um de\
,w
, ou+
.\w
nã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;
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 capturadoNa 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;