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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top