
Дан файл со следующей строкой:
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;
Примечания:
+
не поддерживается в базовых регулярных выражениях.-E
включает расширенные регулярные выражения, которые поддерживают+
.\w+
соответствует одному или нескольким символам слова.[\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})
сопоставляет первые два слова и помещает их в захваченную группу, чтобы мы могли ссылаться на группу при замене[[:lower:]]+
соответствует одному или нескольким строчным символам(.*)
сопоставляет оставшуюся часть строки и помещает в захваченную группуВ замене мы сохранили захваченную группу, 1 (первые два слова с конечным пробелом) и 3 (часть после желаемых строчных букв, которые нужно заменить). Между ними указана желаемая строка замены.
Пример:
% sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/' <<<'fastcgi_param WP_ENV staging;'
fastcgi_param WP_ENV production;