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
sed
o 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-0777
lee 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
N
línea de extensión si no coincide, por ejemplocon
gnu sed
usted 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 sed
usted 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
-0
sorbe todo el archivo, leyéndolo en la memoria. El-p
medio "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 cadenatext
seguida 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""
. Las
bandera hace.
coincidir las nuevas líneas.fuente
-00
lee 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.