Rimuovi tutte le linee dal file a partire da "{" a "}" usando sed
Domanda
Ho un file i cui contenuto sono così:
control_data {
some data dadadadf
some data fsfsfs
some more data
.
.
.
}
more data below
{
.
.
}
.
Voglio eliminare i dati da "Control_Data" al primo "}"
Ho provato un comando
sed "s/control_data\([^}]*\)}//g"
.
Ma questo funziona solo se non abbiamo più righe, ad esempio.Questo comando funziona quando abbiamo dati come:
control_data {some data dadadadf some data fsfsfs some more data...}more data
.
Dà:
more data {....}
.
Come far funzionare questo comando quando abbiamo dati su più linee? Sono nuovo a Shell Scripting Alcune spiegazioni con la risposta andranno molto lontano nell'aiutare.
Grazie in anticipo.
Soluzione
Questo potrebbe non essere ideale ma questo usato sed (il tuo codice sed)
cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'
.
Logica: sto convertendo tutte le nuove linee per: e quindi usando il tuo codice SED e quindi convertire tutto: su Newline Nota: la mia ipotesi è: non sarà presente nel file ovunque.
Altri suggerimenti
My SED-FU è debole, ma ecco cosa ho lavorato (usando Questa risposta come guida):
[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below
{
.
.
}
.
Ecco una rottura del comando
sed -n " # "-n" = suppress automatic printing of pattern space
/^control_data {/ { # if (line matches control data)
:a; # mark this spot with label a
n; # get next line
/^}/!ba # if (doesn't start with "}") go back to label a
n; # get next line before leaving this control block
}; # end if
p; # print everything else not affected by previous block
" input_file.txt
. Questo potrebbe funzionare per te:
sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
.
- .
- Il primo comando rimuove tutte le linee singole
/^control_data {.*}$/d
- Il secondo comando rimuove tutti i blocchi
/^control_data {/,/^}$/d