
給定一個包含以下字串的檔案:
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;