sed: Borrar las líneas que contengan un patrón determinado

Una de las cosas para las que utilizo mucho el comando sed es borrar las líneas de un archivo que contienen un patrón determinado.

Por ejemplo: En nuestras instalaciones tenemos un script sinc_puppet_inst que se ejecuta al final del proceso de arranque y no me interesa que este script se ejecute en una determinada situación.

Podría utilizar el comando sed en un script que se inicie en uno de los runlevels para evitar la ejecución eliminando la línea y añadiéndola después cuando termine el proceso que quiero realizar.

Para eliminar la línea,  podemos hacer lo siguiente:

sed -i  '/sinc_puppet_inst/ d' /etc/rc.local

Si os dáis cuenta, lo que va entre las barras "/" es el patrón a buscar. Y "d" le indica a sed que borre las líneas que contengan el patrón.

Otro de las cosas que podemos querer borrar es bloques de texto que contengan una estructura determinada. Por ejemplo:

sed -i '/BEGIN/,/END/ d' /boot/grub/grub.cfg

El comando anterior borraría el bloque de líneas del fichero /boot/grub/grub.cfg que comienza por la palabra BEGIN y termina con la palabra END.

This Article Has 4 Comments
  1. Bytebubbles Reply

    Enhorabuena por el aporte, muy interesante. Un saludo!

  2. Bytebubbles Reply

    Enhorabuena por el aporte, muy interesante. Un saludo!

  3. Bytebubbles Reply

    Enhorabuena por el aporte. Muy interesante!

  4. Unknown Reply

    Hola, Gracias por el aporte.

    Tengo una duda, como podría utilizar este comando en un shell?

    Tengo el siguiente código:

    #set -x
    ################################################################
    #NOMBRE DEL PROGRAMA:
    #DESCRIPCION: Prueba
    #REALIZADO POR: SGG
    ################################################################

    CARP_BASE=/sasdepot/MONITOR/DAT/FNCSAS01/SALIDAS/
    #///////////////////////////////////7
    DATE=`date +%Y%m%d-%H%M`

    head -1 ${CARP_BASE}top01his.txt > ${CARP_BASE}aux2.txt

    while read line
    do
    var_val1=`echo $line | cut -c1-8`
    echo "$var_val1"
    echo "sed -i '/$var_val1*/d' ${CARP_BASE}top01his.txt"
    sed -i '/$var_val1*/d' ${CARP_BASE}top01his.txt
    done < ${CARP_BASE}aux2.txt

    EL RESULTADO ES EL SIGUIENTE:

    20190210
    sed -i '/20190210*/d' /sasdepot/MONITOR/DAT/FNCSAS01/SALIDAS/top01his.txt

    EL PROBLEMA QUE TENGO ES QUE NO ME ELIMINA ESAS LINEAS QUE ENCUENTRA.

    SALUDOS.

Por favor acceder para comentar.