
次の文字列を含むファイルがあるとします。
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;
ノート:
+
は基本正規表現ではサポートされていません。-E
をサポートする拡張正規表現をオンにします+
。\w+
1 つ以上の単語文字と一致します。 、、またはの[\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})
最初の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;