Com esborrar línies específiques d'un fitxer fent servir set

En determinades ocasions necessitem eliminar alguna línia en específic d'un arxiu o de diversos, per exemple, m'ha passat que he tingut tot un llistat d'arxius i necessito eliminar la línia # 27 de tots aquests (la línia # 27 és la d'una ACL , norma, regla, configuració), bé puc editar arxiu per arxiu o simplement puc aconseguir el que necessito utilitzant la comanda set i un script bash (opcional).

Però, intentem amb un sol arxiu alguna cosa simple.

Tenim l'arxiu distros-deb.txt el qual conté això:

debian

kubuntu

Archlinux

solusos

menta

O sigui, l'arxiu distros-deb.txt és en el qual posarem les distros basades en Debian, però aquí veiem que a la línia 3 està «ArchLinux», distro que evidentment no té res a veure amb Debian, per la qual cosa hem d'eliminar aquesta línia. Per eliminar la línia # 3 de aquest arxiu posarem el següent:

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

Explicar aquesta línia és una cosa fàcil, amb set «3d» estem indicant que eliminarem la línia # 3, amb distros-deb.txt li indiquem sobre què fitxer treballar, és a dir, eliminar la línia # 3 d'aquest arxiu, fins aquí si pressionem Enter ens mostrarà el que desitgem però a la terminal, de manera que amb > Distros-deb-ok.txt estem indicant que en comptes de mostrar al terminal el resultat, que el posi en un fitxer amb aquest nom.

A que és simple?

També, podem evitar fer servir el > Distros-deb-ok.txt usant un paràmetre propi de set, El paràmetre -i

O sigui, en cas que desitgem eliminar la línia de l'arxiu i guardar-ho amb el seu mateix nom (i no en un altre arxiu) n'hi ha prou amb afegir el paràmetre -i :

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

Això eliminarà la línia # 3 de distros-deb.txt i el guardarà.

Què passa si vull un rang de línies, és a dir eliminar la línia # 3 però també la # 4 i # 5? Per aconseguir això posem el rang de el 3 a el 5, és a dir:

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

I em mostrarà només havien de kubuntu 😀

I què si vull eliminar des de la línia 2 fins a l'última, quan no conec el total de línies?

N'hi hauria prou amb fer servir el símbol de Units - »$

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

En cas que es desitgi eliminar des de la primera línia fins a la # 4 llavors simplement posem el valor 1 a l'inici:

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

Això ja és sobretot, un tip bastant útil quan es vol fer scripts bash per automatitzar tasques i es necessita modificar i eliminar línies d'arxius de configuració, per modificar podem usar set o perl, Així com per eliminar ja sabem com fer-ho amb set 😉

Salutacions


16 comentaris, deixa el teu

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   mss-devel va dir

    Molt bona aportació 😉

    1.    KZKG ^ Gaara va dir

      gràcies

      By the way, ens va arribar el teu email ara mateix et responc 😀

      Salutacions

  2.   sense nom va dir

    Com gran sacerdot de la terminal, servidors i connexions ssh vaig a tu, oh gran KZKG ^ Gaara, i et pregunto: on puc aconseguir un tutorial a el nivell de la meva ignorància que em permeti fer servir connexions ssh entre dues màquines remotes en diferents xarxes per compartir arxius de text, pdf, imatge i so (mp3) ....

    🙂

    Ja seriosament, em podries guiar el respecte, tinc dues màquines, una a la feina i una altra a casa i necessito una connexió ssh entre les dues (perquè segons entenc ssh permet compartir contingut entre màquines, o m'equivoco?).
    I si m'equivoco, que aplicació em recomanes?
    I on trobo un Estatut bàsic a l'respecte?

    1.    -spyker- va dir

      scp.

      scp usuari @ direccion_maquina: ruta usuari @ direccion_maquina: ruta.

      Mateixa sintaxi que cp, origen -> destinació.

  3.   F3niX va dir

    Vas aparèixer home, estaves perdut.

  4.   Joaquin va dir

    Bon Tip!

  5.   LycusHackerEmo va dir

    Interessant tipus de ... xD

    per casualitat no coneixeran algun que faci ressaltar text en negreta?
    o sigui tinc un arxiu txt que és un diccionari té mes de 10000 línies i vull que ressalti determinat text abans de «:» els punts suspencivos i fer-ho un per un és massa.

    1.    KZKG ^ Gaara va dir

      Hola,

      Un arxiu txt és de text pla, com el seu nom indica ... pla, sense formats ni res semblant, ho sento però crec que el que demanes no es pot fer o si? 🙁

      Salutacions

      1.    ACA va dir

        en realitat si es pot, però caldria saber el format destí.
        per exemple.:
        echo $ (echo «Robert: Hola. Canvi aquí» | set 's / \ ./. \\ i [40; 31m /; s / \: /: \\ i [40; 35m /')
        és qüestió de apanyar.
        l'altra forma d'esborrar que es pot fer servir és set '/' $ 1 '/ d' però cal estar segur de la re.

        1.    LycusHackerEmo va dir

          doncs acabi de guardar-lo en * .odt

          No hi haurà una forma mes senzilla de fer-ho amb LibreOffice?

  6.   Lolo va dir

    Es podria esborrar part d'una línia i deixar la resta?

    Diguem que vull esborrar tot el que hi ha davant d'una paraula en una determinada fila.

    O bé esborrar tot el que siguie a aquesta paraula.

    1.    ACA va dir

      Si, és qüestió de tirar d'una regex (si cal man set -r, -regexp-extended)
      Partint de que trobo
      trobo «Robert: Hola. Canvi aquí »| set 's / Canvi //'
      amb un patró ben definit i amb. (Un caràcter) i * (mes d'un)
      després:
      trobo «Robert: Hola. Canvi aquí »| set 's / Canvi. * //'
      abans:
      trobo «Robert: Hola. Canvi aquí »| set 's /.* Canvi //'
      Si importa que aparegui la paraula
      trobo «Robert: Hola. Canvi aquí »| set 's / Canvi. * / Canvi /'
      o més rebuscat
      en la línia que contingui Robert el que va després de Canvi
      echo -e «Fritz: Hola. Canvi aquí \ nRobert: Hola. Canvi aquí »| set '/Robert/s/Cambio.*//'
      o com a el principi treure la segona línia i processar la resta
      echo -e «Fritz: Hola. Canvi aquí \ nRobert: Hola. Canvi aquí \ nOtra »| set -i 2D -i 's / Canvi. * //'
      echo -e «Fritz: Hola. Canvi aquí \ nRobert: Hola. Canvi aquí \ nOtra »| set '2d; s / Canvi. * //'

      1.    Lolo va dir

        Gràcies, m'és molt útil.

  7.   MSX va dir

    Lindo article, dels que a mi m'agraden, que gran el SysAdmin!
    Què seria de la nostra vida sense set, awek, perl, grep, tail, head, «Emacs» i tantes altres eines imprescindibles !?

  8.   Lisbeth Ollarves va dir

    Gràcies, va ser de molta ajuda.

  9.   perni va dir

    Bones, i com es podria fer per esborrar d'un fitxer la línia 1,4 i 10 en el mateix ordre?