Sed 正则表达式在 Ubuntu 14 上用于可变词

Rod*_*o M 2 sed regular-expression

给定一个具有以下字符串的文件:

fastcgi_param WP_ENV staging;
Run Code Online (Sandbox Code Playgroud)

我需要一个 sed 表达式,它将用一个新字符串替换单词 'staging':

fastcgi_param WP_ENV production;
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,第三个字是可变的。它可以是任何小写字符串,例如 development、local 等。

我尝试了以下方法:

sed  's/fastcgi_param WP_ENV [\w+]/fastcgi_param WP_ENV production/g' 
Run Code Online (Sandbox Code Playgroud)

但它没有正确地完成工作。该词的正则表达式不匹配。

执行此类替换的正确 sed 命令是什么?

Joh*_*024 5

添加-E和删除方括号:

$ sed -E 's/fastcgi_param WP_ENV \w+/fastcgi_param WP_ENV production/g' file
fastcgi_param WP_ENV production;
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. +基本正则表达式不支持。 -E打开支持+.

  2. \w+匹配一个或多个单词字符。 [\w+]匹配\w、 或中的任何一个+

  3. \w不便携。对于 POSIX 兼容性,请使用:

    $ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file
    fastcgi_param WP_ENV production;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 您可以通过使用捕获组来避免该行的双重输入:

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