Sed regex para una palabra variable en Ubuntu 14

Sed regex para una palabra variable en Ubuntu 14

Dado un archivo con la siguiente cadena:

fastcgi_param WP_ENV staging;

Necesito una expresión sed que reemplace la palabra 'puesta en escena' con una nueva cadena:

fastcgi_param WP_ENV production;

En el primer ejemplo, la tercera palabra es variable. Podría ser cualquier cadena en minúscula, por ejemplo, desarrollo, local, etc.

Intenté lo siguiente:

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

pero no retoma el trabajo correctamente. La expresión regular de la palabra no coincide.

¿Cuál sería el comando sed correcto para realizar este tipo de reemplazo?

Respuesta1

Agregue -Ey elimine los corchetes:

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

Notas:

  1. +no es compatible con expresiones regulares básicas. -Eactiva expresiones regulares extendidas que sí admiten +.

  2. \w+coincide con uno o más caracteres de palabra. [\w+]coincide con cualquiera de \, w, o +.

  3. \wno es portátil. Para compatibilidad con POSIX, utilice:

    $ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file
    fastcgi_param WP_ENV production;
    
  4. Puede evitar la doble escritura de la línea utilizando un grupo de captura:

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

Respuesta2

Hacer:

sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/'
  • ^(([^[:blank:]]+[[:blank:]]+){2})coincide con las dos primeras palabras y las coloca en el grupo capturado para que podamos referir el grupo en el reemplazo

  • [[:lower:]]+coincide con uno o más caracteres en minúscula

  • (.*)coincide con la parte restante de la línea y se coloca en el grupo capturado

  • En el reemplazo hemos mantenido el grupo capturado, 1 (las dos primeras palabras con espacios en blanco al final) y 3 (la parte después de las minúsculas que se desea reemplazar). Entre estos, se proporciona la cadena de reemplazo deseada.

Ejemplo:

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

información relacionada