Ubuntu 14 上变量单词的 Sed 正则表达式

Ubuntu 14 上变量单词的 Sed 正则表达式

给定一个包含以下字符串的文件:

fastcgi_param WP_ENV staging;

我需要一个 sed 表达式来用新字符串替换“staging”一词:

fastcgi_param WP_ENV production;

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

我尝试了以下方法:

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

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

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

答案1

添加-E和删​​除方括号:

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

笔记:

  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;
    
  4. 您可以使用捕获组来避免重复输入该行:

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

答案2

做:

sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/'
  • ^(([^[:blank:]]+[[:blank:]]+){2})匹配前两个单词并将它们放入捕获的组中,以便我们可以在替换中引用该组

  • [[:lower:]]+匹配一个或多个小写字符

  • (.*)匹配该行的剩余部分并放入捕获组中

  • 在替换中,我们保留了捕获的组 1(带有尾随空格的前两个单词)和 3(要替换的所需小写字母之后的部分)。在它们之间,给出了所需的替换字符串。

例子:

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

相关内容