Регулярное выражение Sed для переменного слова в Ubuntu 14

Регулярное выражение Sed для переменного слова в Ubuntu 14

Дан файл со следующей строкой:

fastcgi_param WP_ENV staging;

Мне нужно выражение sed, которое заменит слово «staging» новой строкой:

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+соответствует одному или нескольким символам слова. [\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;

Связанный контент