次の文字列を含むファイルが提供されます。
fastcgi_param WP_ENV staging;
「staging」という単語を新しい文字列に置き換えるには、sed式が必要です。
fastcgi_param WP_ENV production;
最初の例では、3番目の単語は変更可能です。開発、ローカルなどの小文字の文字列にすることができます。
私は以下を試しました:
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;
行を2回入力したくない場合は、キャプチャグループを使用できます。
$ 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;