Cómo borrar líneas específicas de un archivo usando sed

En determinadas ocasiones necesitamos eliminar alguna línea en específico de un archivo o de varios, por ejemplo, me ha sucedido que he tenido todo un listado de archivos y necesito eliminar la línea #27 de todos estos (la línea #27 es la de una ACL, norma, regla, configuración), bien puedo editar archivo por archivo o simplemente puedo lograr lo que necesito usando el comando sed y un script bash (opcional).

Pero, intentemos con un solo archivo algo simple.

Tenemos el archivo distros-deb.txt el cual contiene esto:

debian

kubuntu

archlinux

solusos

mint

O sea, el archivo distros-deb.txt es en el cual pondremos las distros basadas en Debian, pero ahí vemos que en la línea #3 está «archlinux», distro que evidentemente no tiene nada que ver con Debian, por lo que debemos eliminar esa línea. Para eliminar la línea #3 de ese archivo pondremos lo siguiente:

sed "3d" distros-deb.txt > distros-deb-ok.txt

Explicar esta línea es algo fácil, con sed «3d» estamos indicando que eliminaremos la línea #3, con distros-deb.txt le indicamos sobre qué archivo trabajar, o sea, eliminar la línea #3 de este archivo, hasta aquí si presionamos <kbd>Enter</kbd> nos mostrará lo que deseamos pero en la terminal, por lo que con > distros-deb-ok.txt estamos indicando que en vez de mostrar en terminal el resultado, que lo ponga en un archivo con este nombre.

¿A que es simple?

También, podemos evitar usar el > distros-deb-ok.txt usando un parámetro propio de sed, el parámetro -i

O sea, en caso de que deseemos eliminar la línea del archivo y guardarlo con su mismo nombre (y no en otro archivo) basta con agregar el parámetro -i :

sed -i "3d" distros-deb.txt

Esto eliminará la línea #3 de distros-deb.txt y lo guardará.

¿Qué sucede si deseo un rango de líneas, o sea eliminar la línea #3 pero también la #4 y #5? Para lograr esto ponemos el rango del 3 al 5, o sea:

sed -i "3,5d" distros-deb.txt

Y me mostrará solamente debian y kubuntu 😀

¿Y qué si deseo eliminar desde la línea 2 hasta la última, cuando no conozco el total de líneas?

Bastaría con usar el símbolo de dollar -» $

sed -i "2,$d" distros-deb.txt

En caso de que se desee eliminar desde la primera línea hasta la #4 entonces simplemente ponemos el valor 1 al inicio:

sed -i "1,4d" distros-deb.txt

Esto viene siendo todo, un tip bastante útil cuando se desea hacer scripts bash para automatizar tareas y se necesita modificar y eliminar líneas de archivos de configuración, para modificar podemos usar sed o perl, así como para eliminar ya sabemos cómo hacerlo con sed 😉

Saludos


Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   mss-devel dijo

    Muy buen aporte 😉

    1.    KZKG^Gaara dijo

      Gracias 🙂

      By the way, nos llegó tu email ahora mismo te respondo 😀

      Saludos

  2.   nameless dijo

    Como sumo sacerdote de la terminal , servidores y conexiones ssh acudo a ti,oh gran KZKG^Gaara, y te pregunto:dónde puedo conseguir un tutorial al nivel de mi ignorancia que me permita usar conexiones ssh entre dos maquinas remotas en distintas redes para compartir archivos de texto ,pdf ,imagen y sonido(mp3)….

    🙂

    Ya en serio,me podrías guiar al respecto,tengo dos máquinas,una en el trabajo y otra en casa y necesito una conexión ssh entre ambas(porque según entiendo ssh permite compartir contenido entre máquinas,¿o me equivoco?).
    Y si me equivoco,que aplicación me recomiendas?
    Y dónde encuentro un tuto básico al respecto?

    1.    -spyker- dijo

      scp.

      scp usuario@direccion_maquina:ruta usuario@direccion_maquina:ruta.

      Misma sintaxis que cp, origen -> destino.

  3.   F3niX dijo

    Apareciste hombre, estabas perdido.

  4.   Joaquin dijo

    Buen Tip!

  5.   LycusHackerEmo dijo

    Interesante tip… xD

    por casualidad no conoceran alguno que haga resaltar texto en negrita?
    osea tengo un archivo txt que es un diccionario tiene mas de 10000 lineas y quiero que resalte determinado texto antes de «:» los puntos suspencivos y hacerlo uno por uno es demasiado.

    1.    KZKG^Gaara dijo

      Hola,

      Un archivo txt es de texto plano, como su nombre lo indica … plano, sin formatos ni nada similar, lo siento pero creo que lo que pides no se puede hacer o si? 🙁

      Saludos

      1.    aca dijo

        en realidad si se puede, pero habría que saber el formato destino.
        pe:
        echo $(echo «Robert: Hola. Cambio aquí»|sed ‘s/\./.\\e[40;31m/;s/\:/:\\e[40;35m/’)
        es cuestión de apañarse.
        lo otra forma de borrar que se puede usar es sed ‘/’$1’/d’ pero hay que estar seguro de la re.

        1.    LycusHackerEmo dijo

          pues termine de guardarlo en *.odt

          No habra una forma mas sencilla de hacerlo con LibreOffice?

  6.   Lolo dijo

    ¿Se podría borrar parte de una línea y dejar el resto?

    Digamos que quiero borrar todo lo que hay delante de una palabra en una determinada fila.

    O bien borrar todo lo que siguie a esa palabra.

    1.    aca dijo

      Si, es cuestión de tirar de una regex (si es necesario man sed -r, –regexp-extended)
      Partiendo de que encuentro
      echo «Robert: Hola. Cambio aquí» | sed ‘s/Cambio//’
      con un patrón bien definido y con . (un caracter) y * (mas de uno)
      Después:
      echo «Robert: Hola. Cambio aquí» | sed ‘s/Cambio.*//’
      Antes:
      echo «Robert: Hola. Cambio aquí» | sed ‘s/.*Cambio//’
      Si importa que aparezca la palabra
      echo «Robert: Hola. Cambio aquí» | sed ‘s/Cambio.*/Cambio/’
      o mas rebuscado
      en la linea que contenga Robert lo que va después de Cambio
      echo -e «Fritz: Hola. Cambio aquí\nRobert: Hola. Cambio aquí» | sed ‘/Robert/s/Cambio.*//’
      o como al principio sacar la segunda linea y procesar el resto
      echo -e «Fritz: Hola. Cambio aquí\nRobert: Hola. Cambio aquí\nOtra» | sed -e 2d -e ‘s/Cambio.*//’
      echo -e «Fritz: Hola. Cambio aquí\nRobert: Hola. Cambio aquí\nOtra» | sed ‘2d;s/Cambio.*//’

      1.    Lolo dijo

        Gracias, me es muy útil.

  7.   msx dijo

    Lindo artículo, de los que a mi me gustan, que grande el SysAdmin!
    Qué sería de nuestra vida sin sed, awek, perl, grep, tail, head, «Emacs» y tantas otras herramientas imprescindibles!?

  8.   Lisbeth Ollarves dijo

    Gracias, fue de mucha ayuda.

  9.   Perni dijo

    Buenas, y como se podría hacer para borrar de un fichero la línea 1,4 y 10 en el mismo comando?