Tengo un archivo grande que tiene caracteres especiales. Hay un código de varias líneas allí, con el que quiero reemplazar sed.
Esta:
  text = "\
    ------                                                           ------\n\n\
    This message was automatically generated by email software\n\
    The delivery of your message has not been affected.\n\n\
    ------                                                           ------\n\n"
Necesita convertirse en esto:
text = ""
Intenté el siguiente código, pero no tuve suerte:
sed -i '/  text = "*/ {N; s/  text = .*affected.\./  text = ""/g}' /etc/exim.conf
No reemplaza nada y no muestra ningún mensaje de error
He estado jugando con él, pero todo lo que intento no funciona.
                    
                        text-processing
                                sed
                                perl
                                
                    
                    
                        cuchilla19899
fuente
                
                fuente

sedo estás abierto a otras herramientas? ¿Puede haber"dentro deltext=bloque? ¿Puede haber otros casostext =en su archivo? ¿Habrá siempre 4 líneas de texto o puede haber más / menos?sed, o cualquier cosa que no requiera instalación en un servidor CentOS. Herramientastext =en la carpeta, el resultado debe sertext = "". Los archivos tienen 891 líneas de código. Por lo tanto, debe respetar el otro texto.text = "". Como se ve en mi pregunta.Respuestas:
Perl al rescate:
-i~editará el archivo "en su lugar", dejando una copia de seguridad-0777lee todo el archivo a la vez, no línea por líneaLa sustitución
s///funciona de manera similar a como en sed (es decir, coincidetext = "seguido de cualquier cosa menos comillas dobles muchas veces hasta una comilla doble), pero en este caso, funciona en todo el archivo.fuente
Debe verificar el espacio del patrón y seguir tirando de la
Nlínea de extensión si no coincide, por ejemplocon
gnu sedusted puede escribirlo comoSin embargo, eso no es muy eficiente, mejor solo seleccione el rango
/text = "/,/"/, modifique la primera línea y elimine el resto:de nuevo, con
gnu sedusted puede escribirlo como una línea:fuente
Personalmente, haría esto en Perl. Si podemos suponer que no hay
"antes del cierre", puede hacer:El
-0sorbe todo el archivo, leyéndolo en la memoria. El-pmedio "imprime cada línea (aquí, una" línea "será el archivo completo) después de aplicar la secuencia de comandos dada por-e". El script en sí es un operador de sustitución simple. Capturará la cadenatextseguida de 0 o más espacios en blanco, an=y 0 o más espacios en blanco nuevamente (text\s*=\s*) y la guardará como$1. Luego, reemplazará el patrón capturado, así como la cadena citada más corta que encuentre con el patrón ($1) y"". Lasbandera hace.coincidir las nuevas líneas.fuente
-00lee en párrafos, no todo el archivo ( ref ). Si el texto entre comillas contiene una línea en blanco, la expresión regular no coincidirá.perl -00ne 'print;exit'. ¡Y todavía pongo el incorrecto en mi respuesta! Gracias, arreglado ahora.