给定一个包含以下字符串的文件:
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;
笔记:
+
基本正则表达式不支持。-E
打开支持的扩展正则表达式+
。\w+
匹配一个或多个单词字符。 匹配、、 或[\w+]
中的任何一个。\
w
+
\w
不便于携带。对于 POSIX 兼容性,请使用:$ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file fastcgi_param WP_ENV production;
您可以使用捕获组来避免重复输入该行:
$ 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;