Я пытаюсь редактировать мой файл nginx.conf программно, который содержит такую строку:
access_log /var/log/nginx/access.log;
который я хочу выглядеть так:
access_log /dev/stdout;
Я верю, что регулярное выражение ^\s*access_log([^;]*);
захватит /var/log/nginx/access.log
часть в группе захвата, но я не уверен, как правильно заменить группу захвата на sed?
я пробовал
echo " access_log /var/log/nginx/access.log;" | sed 's/^\s*access_log([^;]*);/\1\\\/dev\\\/stdout/'
но я получаю ошибку:
sed: -e expression #1, char 45: invalid reference \1 on `s' command's RHS
если я попытаюсь, sed -r
то ошибки нет, но результат не соответствует ожиданиям:
/var/log/nginx/access.log\/dev\/stdout
Я пытаюсь быть умным с группой захвата и еще много чего, а не искать напрямую "access_log /var/log/nginx/access.log;" в случае, если дистрибутив меняет расположение файла журнала по умолчанию.
sed '/access_log/s|/[^;]\+|/dev/stdout|'
Ответы:
Пара ошибок там.
Во-первых, поскольку
sed
используются базовые регулярные выражения, нужно\(
и\)
сделать группу захвата.-r
Переключатель позволяет расширенные регулярные выражения, поэтому вы не получите сообщение об ошибке. См. Почему мне нужно экранировать символы регулярного выражения в sed, чтобы интерпретировать их как символы регулярного выражения? ,Во-вторых, вы помещаете группу захвата не в то место. Если я вас правильно понимаю, вы можете сделать это:
Обратите внимание на использование в
!
качестве разделителей регулярных выражений, чтобы избежать экранирования/dev/stdout
.источник
В своем регулярном выражении вы должны знать, что
\No.
это обратная ссылка на шаблон в скобках()
. Так что регулярное выражение должно быть's@^(\s*access_log ).*$@\1/dev/stdout/;@'
Я могу предложить
СОВЕТ: намерены ли вы использовать
/
внутри патерна, вы можете изменитьs///
для каждого символа, который вы хотите,s###
напримеристочник
Вместо того, чтобы захватить это, почему бы просто не найти это и сделать замену? То есть:
Он ищет строки, которые соответствуют "
access_log
", а затем в любых строках, которые он заменяет, "/whatever/path/is/there;
" на "/dev/stdout;
"источник