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;

相關內容