Come posso eliminare tutto il testo tra parentesi graffe in un file di testo multilinea?


10

Esempio:

This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.

Dovrebbe diventare:

This is 
that wants
 anyway.

Ho trovato alcuni thread simili nel forum, ma non sembrano funzionare con parentesi graffe multilinea.

Se possibile, preferirei un metodo a una riga, come soluzioni basate su grep, sed, awk ... ecc.

EDIT: Le soluzioni sembrano essere OK, ma ho notato che i miei file originali includono l'annidamento di parentesi graffe. Quindi sto aprendo una nuova domanda. Grazie a tutti: come posso eliminare tutto il testo tra parentesi graffe nidificate in un file di testo multilinea?


1
Prova questosed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Costas,

Risposte:


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

Spiegazione:

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

    Questo legge l'intero file nello spazio modello.

    :againè un'etichetta. Nlegge nella riga successiva. $!b againsi ramifica di nuovo againsull'etichetta a condizione che questa non sia l'ultima riga.

  • s/{[^}]*}//g

    Questo rimuove tutte le espressioni tra parentesi graffe.

Su Mac OSX, prova:

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

Parentesi graffe nidificate

Prendiamo questo come file di test con molte parentesi graffe nidificate:

a{b{c}d}e
1{2
}3{
}
5

Ecco una modifica per gestire le parentesi graffe nidificate:

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

Spiegazione:

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

    È lo stesso di prima: legge in tutto il file.

  • :b

    Questo definisce un'etichetta b.

  • s/{[^{}]*}//g

    Ciò rimuove il testo tra parentesi graffe purché il testo non contenga parentesi graffe interne.

  • t b

    Se il comando sostitutivo sopra riportato ha comportato una modifica, tornare all'etichetta b. In questo modo, il comando sostitutivo viene ripetuto fino alla rimozione di tutti i gruppi di parentesi graffe.


La tua risposta sembra perfetta. Finché la nuova domanda che ho appena aperto (leggi la domanda originale EDIT) non è esattamente la stessa, penso che dovresti rispondere anche tu. Andrebbe bene con le regole del forum?
Sopalajo de Arrierez,

@ John1024, è possibile spostare qui la modifica poiché l'OP ha pubblicato una nuova domanda relativa alla stessa.
Ramesh,

1
OK. L'ho copiato laggiù e modificato per utilizzare il testo di esempio nella nuova domanda.
Giovanni 1024

5

Perl:

perl -0777 -pe 's/{.*?}//sg' file

Se si desidera modificare sul posto

perl -0777 -i -pe 's/{.*?}//sg' file

Questo legge il file come una singola stringa e fa una ricerca e sostituzione globale.

Questo gestirà le parentesi graffe nidificate:

perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'

Grazie, è stato molto utile! Questo mi ha aiutato a risolvere un problema con uno script di compilazione per sostituire il contenuto di una funzione in pochi minuti contro la lotta con sed con ah..em, più tempo di quello che ammetterò (ore
tosse ...

4

sed:

sed '/{/{:1;N;s/{.*}//;T1}' multiline.file

è iniziato dalla riga con {e ottiene la riga successiva ( N) fino a quando non è {}possibile effettuare la sostituzione ( ) ( Tsignifica tornare al segno fatto :se la sostituzione non viene effettuata)

Un po 'di modifica per essere vero se molti curl sono racchiusi in una riga

sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file

Rimuovi tutti i simboli tra parentesi ( [^}]uguale a ogni simbolo esclusoright bracket per rendere sednon avido), e se nella riga rimangono left bracked- torna indietro per iniziare con la riga successiva aggiunta se non c'è right bracket.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.