Como eliminar liñas específicas dun ficheiro usando sed

En certas ocasións necesitamos eliminar unha liña específica dun ficheiro ou varias, por exemplo, sucedeume que tiven unha lista completa de ficheiros e que teño que eliminar a liña # 27 de todos estes (a liña # 27 é a dunha ACL , norma, regra, configuración), podo editar ficheiro por ficheiro ou simplemente podo conseguir o que necesito usando o comando sed e un script bash (opcional).

Pero, imos probar un único ficheiro un tanto sinxelo.

Temos o arquivo distros-deb.txt que contén isto:

debian

ubuntu

Archlinux

solos

menta

Noutras palabras, o ficheiro distros-deb.txt é no que poñeremos as distros baseadas en Debian, pero alí vemos que na liña # 3 hai "archlinux", unha distro que obviamente non ten nada que ver con Debian, polo que debemos eliminar esa liña. Para eliminar a liña # 3 dese ficheiro poñeremos o seguinte:

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

Explicar esta liña é algo sinxelo, con sedento "3d" estamos indicando que eliminaremos a liña # 3, con distros-deb.txt Indicamos en que ficheiro traballar, é dicir, eliminar a liña # 3 deste ficheiro, ata aquí se prememos Intro mostraranos o que queremos pero no terminal, así que con > distros-deb-ok.txt estamos indicando que en vez de amosar o resultado en terminal, que o puxo nun ficheiro con este nome.

Que é sinxelo?

Ademais, podemos evitar usar o > distros-deb-ok.txt empregando un parámetro axeitado de sed, o parámetro -i

É dicir, no caso de que queiramos eliminar a liña do ficheiro e gardala co mesmo nome (e non noutro ficheiro), simplemente engade o parámetro -i :

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

Isto eliminará a liña # 3 de distros-deb.txt e gardaraa.

E se quero un rango de liñas, é dicir, eliminar a liña # 3 pero tamén a # 4 e a # 5? Para conseguilo poñemos o rango de 3 a 5, é dicir:

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

E só me amosará debian e kubuntu 😀

Entón, e se quero eliminar da liña 2 á última cando non sei as liñas totais?

Simplemente use o símbolo do dólar - »$

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

No caso de que queira eliminar da primeira liña ao # 4, simplemente poñemos o valor 1 ao comezo:

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

Isto foi todo, un consello moi útil cando queres facer scripts bash para automatizar tarefas e necesitas modificar e eliminar liñas de ficheiros de configuración, para modificar podemos usar sed o perla, así como eliminar xa sabemos como facelo con sed 😉

lembranzas


O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

16 comentarios, deixa os teus

Deixa o teu comentario

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados con *

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.

  1.   mss-devel dixo

    Moi boa contribución 😉

    1.    KZKG ^ Gaara dixo

      Grazas

      Por certo, recibimos o teu correo electrónico agora mesmo che responderei 😀

      lembranzas

  2.   sen nome dixo

    Como sumo sacerdote do terminal, servidores e conexións ssh veño a vostede, oh KZKG ^ Gaara, e pregúntolle: onde podo obter un tutorial a nivel da miña ignorancia que me permita usar conexións ssh entre dúas máquinas remotas en redes diferentes para compartir ficheiros de texto, pdf, imaxe e son (mp3)….

    🙂

    En serio, podería orientarme a este respecto, teño dúas máquinas, unha no traballo e outra na casa e necesito unha conexión ssh entre ambas (porque tal e como o entendo, ssh permite compartir contido entre máquinas, ¿non si?).
    E se me equivoco, que aplicación recomendas?
    E onde atopo un tutorial básico ao respecto?

    1.    -spyker- dixo

      scp

      scp usuario @ máquina_dirección: camiño usuario @ máquina_dirección: camiño.

      A mesma sintaxe que cp, fonte -> destino.

  3.   f3niX dixo

    Presentaches home, estabas perdido.

  4.   Joaquín dixo

    Bo consello!

  5.   LycusHackerEmo dixo

    Consello interesante ... xD

    por casualidade non coñeces a un que faga destacar o texto en negrita?
    Quero dicir, teño un ficheiro txt que é un dicionario, ten máis de 10000 liñas e quero que resalte certo texto antes dos puntos de suspensión ":" e facelo un por un é demasiado.

    1.    KZKG ^ Gaara dixo

      Ola,

      Un ficheiro txt é un texto sinxelo, como o nome indica ... sinxelo, sen formatos nin nada similar, síntoo pero creo que o que pides non se pode facer, non si? 🙁

      lembranzas

      1.    aca dixo

        en realidade pode, pero tería que coñecer o formato de destino.
        por exemplo:
        echo $ (echo "Robert: Ola. Cambia aquí" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        é cuestión de facer fronte.
        a outra forma de eliminar que se pode usar é sed '/' $ 1 '/ d', pero ten que estar seguro do re.

        1.    LycusHackerEmo dixo

          logo remate de gardalo en * .odt

          Non hai un xeito máis sinxelo de facelo con LibreOffice?

  6.   Lolo dixo

    ¿Podería eliminar parte dunha liña e deixar o resto?

    Digamos que quero eliminar todo diante dunha palabra nunha fila determinada.

    Ou elimina todo o que segue a esa palabra.

    1.    aca dixo

      Si, trátase de tirar dunha regla (se é necesario man sed -r, –regexp-Extended)
      Partindo do que atopo
      eco «Robert: Ola. Cambia aquí »| sed 's / Cambiar //'
      cun patrón ben definido e con. (un carácter) e * (máis dun)
      Despois:
      eco «Robert: Ola. Cambia aquí »| sed 's / Change. * //'
      Antes:
      eco «Robert: Ola. Cambia aquí »| sed 's /. * Cambiar //'
      Se importa que apareza a palabra
      eco «Robert: Ola. Cambia aquí »| sed 's / Cambiar. * / Cambiar /'
      ou máis elaborado
      na liña que contén a Robert o que vai despois de Cambiar
      eco -e «Fritz: Ola. Cambia aquí \ nRobert: Ola. Cambia aquí »| sed '/Robert/s/Cambio.*//'
      ou como ao principio saca a segunda liña e procesa o resto
      eco -e «Fritz: Ola. Cambia aquí \ nRobert: Ola. Cambia aquí \ nOutro »| sed -e 2d -e 's / Cambiar. * //'
      eco -e «Fritz: Ola. Cambia aquí \ nRobert: Ola. Cambia aquí \ nOutro »| sed '2d; s / Change. * //'

      1.    Lolo dixo

        Grazas, é moi útil para min.

  7.   MSX dixo

    Bo artigo, un dos que me gusta, que xenial é SysAdmin!
    Que sería da nosa vida sen sed, awek, perl, grep, tail, head, "Emacs" e tantas outras ferramentas esenciais?

  8.   Lisbeth Ollarves dixo

    Grazas, foi moi útil.

  9.   Perni dixo

    Ola, e como podería eliminar as liñas 1,4 e 10 do mesmo comando dun ficheiro?