Estoy tratando de editar mi archivo nginx.conf mediante programación, que contiene una línea como esta:
access_log /var/log/nginx/access.log;
que quiero lucir así:
access_log /dev/stdout;
Creo que la expresión regular ^\s*access_log([^;]*);
capturará la /var/log/nginx/access.log
parte en un grupo de captura, pero no estoy seguro de cómo reemplazar correctamente el grupo de captura con sed.
He intentado
echo " access_log /var/log/nginx/access.log;" | sed 's/^\s*access_log([^;]*);/\1\\\/dev\\\/stdout/'
pero recibo el error:
sed: -e expression #1, char 45: invalid reference \1 on `s' command's RHS
si lo intento, sed -r
entonces no hay error, pero la salida no es lo que espero:
/var/log/nginx/access.log\/dev\/stdout
Estoy tratando de ser inteligente con el grupo de captura y otras cosas y no buscar directamente "access_log /var/log/nginx/access.log;" en caso de que la distribución cambie la ubicación predeterminada del archivo de registro.
sed '/access_log/s|/[^;]\+|/dev/stdout|'
Respuestas:
Un par de errores allí.
En primer lugar, ya que
sed
utiliza expresiones regulares básicas, es necesario\(
y\)
hacer un grupo de captura. El-r
modificador habilita expresiones regulares extendidas, por lo que no obtiene el error. Consulte ¿Por qué necesito escapar de los caracteres regex en sed para ser interpretados como caracteres regex? .En segundo lugar, está colocando el grupo de captura en el lugar equivocado. Si te entiendo correctamente, puedes hacer esto:
Tenga en cuenta el uso de
!
delimitadores como expresiones regulares para evitar tener que escapar de las barras diagonales/dev/stdout
.fuente
En tu expresión regular debes saber que
\No.
es la referencia posterior al patrón entre paréntesis()
. Entonces regexp debería ser's@^(\s*access_log ).*$@\1/dev/stdout/;@'
Puedo ofrecer
SUGERENCIA: Si tiene la intención de usar
/
dentro del patrón, puede cambiarlos///
por cada símbolo que desee,s###
por ejemplofuente
En lugar de capturarlo, ¿por qué no solo encontrarlo y hacer una sustitución? Es decir:
Busca líneas que coinciden con "
access_log
" y luego en cualquier línea que lo haga reemplazará "/whatever/path/is/there;
" con "/dev/stdout;
"fuente