Ejemplo:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
Debe convertirse:
This is
that wants
anyway.
Encontré algunos hilos similares en el foro, pero no parecen funcionar con llaves de varias líneas.
Si es posible, preferiría algún método de una línea, como soluciones basadas en grep, sed, awk ... etc.
EDITAR: Las soluciones parecen estar bien, pero he notado que mis archivos originales incluyen la anidación de llaves. Entonces estoy abriendo una nueva pregunta. Gracias a todos: ¿Cómo puedo eliminar todo el texto entre llaves en un archivo de texto de varias líneas?
text-processing
sed
awk
grep
Sopalajo de Arrierez
fuente
fuente
sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Respuestas:
Explicación:
:again;$!N;$!b again;
Esto lee todo el archivo en el espacio del patrón.
:again
Es una etiqueta.N
lee en la siguiente línea.$!b again
vuelve a laagain
etiqueta con la condición de que esta no sea la última línea.s/{[^}]*}//g
Esto elimina todas las expresiones entre llaves.
En Mac OSX, intente:
Tirantes anidados
Tomemos esto como un archivo de prueba con muchas llaves anidadas:
Aquí hay una modificación para manejar llaves anidadas:
Explicación:
:again;$!N;$!b again
Esto es lo mismo que antes: se lee en todo el archivo.
:b
Esto define una etiqueta
b
.s/{[^{}]*}//g
Esto elimina el texto entre llaves siempre que el texto no contenga llaves internas.
t b
Si el comando sustituto anterior resultó en un cambio, vuelva a la etiqueta
b
. De esta manera, el comando sustituto se repite hasta que se eliminan todos los grupos de llaves.fuente
EDIT
) no sea exactamente la misma, creo que debería responderla también. ¿Estaría bien con las reglas del foro?Perl:
Si desea editar en el lugar
Eso lee el archivo como una sola cadena y realiza una búsqueda y reemplazo global.
Esto manejará arriostrados anidados:
fuente
Sed:
comenzó desde la línea con
{
y obtiene la siguiente línea (N
) hasta que{}
se pueda realizar la sustitución ( ) (T
significa volver a la marca realizada:
si no se realiza la sustitución)Un poco de modificación para que sea cierto si muchas curvas se rompen en una línea
Elimine todos los símbolos entre paréntesis (
[^}]
igual a cada símbolo exceptoright bracket
para quesed
no sea codicioso), y si permanece en la línealeft bracked
, regrese para comenzar con la siguiente línea agregada si no la hayright bracket
.fuente