Ubuntu 14 で変数の単語を正規表現で取得する

Ubuntu 14 で変数の単語を正規表現で取得する

次の文字列を含むファイルがあるとします。

fastcgi_param WP_ENV staging;

「staging」という単語を新しい文字列に置き換える sed 式が必要です。

fastcgi_param WP_ENV production;

最初の例では、3 番目の単語は変数です。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+1 つ以上の単語文字と一致します。 、、またはの[\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})最初の2つの単語に一致し、それらをキャプチャグループに入れて、置換でグループを参照できるようにします。

  • [[:lower:]]+1つ以上の小文字に一致します

  • (.*)行の残りの部分と一致し、キャプチャされたグループに入れられます

  • 置換では、キャプチャされたグループ 1 (末尾に空白がある最初の 2 つの単語) と 3 (置換する小文字の後の部分) が保持されます。これらの間に、必要な置換文字列が指定されます。

例:

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

関連情報