Quiero editar un archivo mediante un script sed en un script bash. Quiero que esto sea fácil de mantener más tarde; fácil de entender y modificar La cadena de reemplazo se ve así:¿Cómo puedo escapar de las barras diagonales inversas en un script sed incrustado en un script bash?
PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]'
En un mundo perfecto, que desea:
sed -i "s/^PS1.*$/PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]'/g" /etc/skel/.bashrc
El problema es que bash y SED se Excluyendo el \
dando el siguiente resultado en el archivo:
PS1='[e[1;32m][@h W]$[e[0m]'
Obviamente no se pueden utilizar comillas simples. Una solución de fuerza bruta es el uso de los escapes, pero para que esto funcione me sale una línea que parece muy feo:
sed -i "s/^PS1.*$/PS1='\\\\[\\\\e[1;32m\\\\][\\\\[email protected]\\\\h \\\\W]\\\\$\\\\[\\\\e[0m\\\\]'/g" /etc/skel/.bashrc
que desea que el script se pueda leer y autónomo (no usar archivos externos). ¿Alguna alternativa a la anterior?
Usa comillas simples alrededor de algo como una expresión regular a menos que necesites absolutamente alguna variable interpolada en la cadena. Incluso entonces, use comillas simples para la mayoría de las expresiones regulares, y solo use las comillas dobles alrededor de la parte que debe ser interpolada. Usando un ejemplo inventado: 'sed-e 's /\.\*'"$ 1"' \ * \ ./ ab '"$ 2"' c '\' 'd /' $ 3' o algo similar. La secuencia ''\' '' es cómo incrusta una comilla simple en la línea de comando; la primera cotización individual termina la sección actual de una sola cotización; la comilla invertida inserta una comilla simple en la cadena; la tercera cita individual resume la comilla simple. –