Sed regex для переменного слова на Ubuntu 14

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

fastcgi_param WP_ENV staging; 

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

 fastcgi_param WP_ENV production; 

В первом примере третье слово является переменным. Это может быть любая строчная строка, например, разработка, локальная и т. Д.

Я попробовал следующее:

 sed 's/fastcgi_param WP_ENV [\w+]/fastcgi_param WP_ENV production/g' 

но он не правильно подбирает работу. Регулярное выражение для слова не совпадает.

Какова была бы правильная команда sed для этого типа замены?

Добавьте -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; 

Делать:

 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;