¿Cómo puedo eliminar todo el texto entre llaves anidadas en un archivo de texto de varias líneas?

Respuestas:

13
$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file3
This is 
that wants
 anyway.

Explicación:

  • :again;$!N;$!b again

    Esto se lee en todo el archivo.

    :againEs una etiqueta. Nlee en la siguiente línea y $!Nlee en la siguiente línea con la condición de que aún no estemos en la última línea. $!b againvuelve a la againetiqueta con la condición de que esta no sea la última línea.

  • :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.

John1024
fuente
3

Un enfoque de Perl:

$ perl -F"" -a00ne 'for (@F){$i++ if /{/; $i||print; $i-- if /}/}' file
This is 
that wants
 anyway

Explicación

  • -a: activa la división automática en el delimitador de archivo dado por -Fen la @Fmatriz.
  • -F"": establece el separador de campo de entrada en vacío, lo que dará como resultado que cada elemento @Fsea ​​uno de los caracteres de entrada.
  • -00: active el "modo párrafo", donde una "línea" se define como dos caracteres de línea nueva consecutivos. Esto significa que el archivo completo en este caso se tratará como una sola línea. Si su archivo puede tener muchos párrafos y los corchetes pueden abarcar varios párrafos, use -0777en su lugar.
  • -ne : lee un archivo de entrada y aplica el script dado por -e a cada línea.

El guión en sí es realmente bastante simple. Un contador se incrementa en uno cada vez que {se ve un y decrementa en uno por cada }. Esto significa que cuando el contador es 0, no estamos entre corchetes y deberíamos imprimir:

  • for (@F){} : haga esto para cada elemento de @F cada carácter en la línea.
  • $i++ if /{/; : incremento $i en uno si este personaje es un{
  • $i||print; : imprimir a menos que $i esté configurado (0 cuenta como no establecido).
  • $i-- if /}/: decremento $ipor uno si este personaje es un}
terdon
fuente