Retire todas las líneas del archivo a partir de "{" a "}" usando SED
Pregunta
Tengo un archivo cuyos contenidos son así:
control_data {
some data dadadadf
some data fsfsfs
some more data
.
.
.
}
more data below
{
.
.
}
Quiero eliminar los datos de "control_data" a la primera "}"
Intenté un comando
sed "s/control_data\([^}]*\)}//g"
Pero esto solo funciona si no tenemos varias líneas, por ejemplo.Este comando funciona cuando tenemos datos como:
control_data {some data dadadadf some data fsfsfs some more data...}more data
da:
more data {....}
¿Cómo hacer que este comando funciona cuando tengamos datos en varias líneas? Soy nuevo en Shell Scripting Alguna explicación con la respuesta será un largo camino para ayudar.
gracias de antemano.
Solución
Este puede no ser ideal, pero esto usó SED (su código SED)
cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'
lógica: Estoy convirtiendo todas las líneas nuevas para: y luego usando su código SED y luego convertir todo: a los recién llegados Nota: Mi suposición es: no estará presente en el archivo en cualquier lugar.
Otros consejos
Mi SED-FU es débil, pero aquí está lo que tengo trabajando (usando esta respuesta como guía):
[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below
{
.
.
}
Aquí hay un desglose 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
Esto podría funcionar para usted:
sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
- El primer comando elimina todas las líneas individuales
/^control_data {.*}$/d
- El segundo comando elimina todos los bloques
/^control_data {/,/^}$/d