Specifieke regels uit een bestand verwijderen met sed

In bepaalde gevallen moeten we een specifieke regel uit een bestand of meerdere verwijderen, het is me bijvoorbeeld overkomen dat ik een hele lijst met bestanden heb en ik moet regel 27 van al deze regels verwijderen (regel 27 is dat van een ACL, norm, regel, configuratie), kan ik bestand voor bestand bewerken of ik kan gewoon bereiken wat ik nodig heb met de opdracht dorst en een bash-script (optioneel).

Maar laten we een enkel bestand enigszins eenvoudig proberen.

We hebben het dossier distributies-deb.txt die dit bevat:

debian

kubuntu

archlinux

solussen

munt

Met andere woorden, het bestand distributies-deb.txt is waarin we de op Debian gebaseerde distributies zullen plaatsen, maar daar zien we dat er in regel # 3 "archlinux" is, een distro die duidelijk niets met Debian te maken heeft, dus we moeten die regel elimineren. Om regel 3 van dat bestand te verwijderen, zullen we het volgende plaatsen:

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

Het uitleggen van deze regel is enigszins eenvoudig, met dorst "3d" we geven aan dat we regel # 3 zullen verwijderen, met distributies-deb.txt We geven aan aan welk bestand we moeten werken, dat wil zeggen, verwijder regel # 3 van dit bestand, tot hier als we op Enter drukken , zal het ons laten zien wat we willen, maar in de terminal, dus met > distros-deb-ok.txt we geven aan dat in plaats van het resultaat weer te geven in terminal, het in een bestand met deze naam is geplaatst.

Wat is simpel?

We kunnen ook voorkomen dat we de > distros-deb-ok.txt met behulp van een juiste parameter van dorst, de parameter -i

Dat wil zeggen, in het geval dat we de regel uit het bestand willen verwijderen en het met dezelfde naam willen opslaan (en niet in een ander bestand), voeg dan gewoon de parameter toe -i :

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

Hiermee wordt regel 3 uit distros-deb.txt verwijderd en opgeslagen.

Wat als ik een reeks regels wil, dat wil zeggen regel # 3 maar ook # 4 en # 5 verwijderen? Om dit te bereiken zetten we het bereik van 3 tot 5, dat wil zeggen:

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

En het toont me alleen debian en kubuntu 😀

Dus wat als ik wil verwijderen van regel 2 naar de laatste, als ik het totaal aantal regels niet weet?

Gebruik gewoon het dollarteken - »$

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

Als u de eerste regel naar # 4 wilt elimineren, plaatsen we eenvoudig de waarde 1 aan het begin:

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

Dit was alles, een zeer nuttige tip als je bash-scripts wilt maken om taken te automatiseren en je regels met configuratiebestanden moet aanpassen en verwijderen, om te wijzigen kunnen we gebruiken dorst o perl, evenals om te elimineren, we weten al hoe we het moeten doen met sed 😉

groeten


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   mss-ontwikkeling zei

    Zeer goede bijdrage 😉

    1.    KZKG ^ Gaara zei

      Bedankt

      Trouwens, we hebben je e-mail nu ontvangen, ik antwoord je 😀

      groeten

  2.   naamloos zei

    Als hogepriester van de terminal, servers en SSH-verbindingen kom ik naar je toe, oh geweldige KZKG ^ Gaara, en ik vraag je: waar kan ik een tutorial krijgen op het niveau van mijn onwetendheid waarmee ik SSH-verbindingen tussen twee externe machines kan gebruiken in verschillende netwerken om tekstbestanden, pdf, beeld en geluid (mp3) te delen….

    🙂

    Serieus, kun je me hierin begeleiden, ik heb twee machines, één op het werk en één thuis, en ik heb een SSH-verbinding tussen hen nodig (want zoals ik het begrijp, staat SSH toe dat inhoud tussen machines wordt gedeeld, heb ik gelijk? ).
    En als ik het mis heb, welke toepassing raadt u dan aan?
    En waar vind ik in dit verband een eenvoudige tutorial?

    1.    -spionker- zei

      scp

      scp gebruiker @ machine_adres: pad gebruiker @ machine_adres: pad.

      Dezelfde syntaxis als cp, source -> bestemming.

  3.   f3niX zei

    Je kwam opdagen man, je was verdwaald.

  4.   Joaquin zei

    Goed advies!

  5.   LycusHackerEmo zei

    Interessante tip… xD

    Kent u er toevallig een waarmee vetgedrukte tekst opvalt?
    Ik bedoel, ik heb een txt-bestand dat een woordenboek is, het heeft meer dan 10000 regels en ik wil dat het bepaalde tekst markeert vóór de ":" hangpunten en het een voor een doen is te veel.

    1.    KZKG ^ Gaara zei

      Hallo,

      Een txt-bestand is platte tekst, zoals de naam al aangeeft ... gewoon, zonder formaten of iets dergelijks, het spijt me maar ik denk dat wat je vraagt ​​niet kan worden gedaan, toch? 🙁

      groeten

      1.    aca zei

        eigenlijk kan het, maar u zou het bestemmingsformaat moeten kennen.
        bv:
        echo $ (echo "Robert: Hallo. Verander hier" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        het is een kwestie van rondkomen.
        de andere manier om te verwijderen die kan worden gebruikt, is sed '/' $ 1 '/ d', maar je moet er zeker van zijn.

        1.    LycusHackerEmo zei

          bewaar het vervolgens in * .odt

          Is er geen gemakkelijkere manier om dit te doen met LibreOffice?

  6.   Lolo zei

    Kunt u een deel van een regel verwijderen en de rest laten?

    Stel dat ik alles vóór een woord in een bepaalde rij wil verwijderen.

    Of verwijder alles wat op dat woord volgt.

    1.    aca zei

      Ja, het is een kwestie van een regex trekken (indien nodig man sed -r, –regexp-extended)
      Beginnend met wat ik vind
      echo «Robert: Hallo. Wijzig hier »| sed 's / Wijzigen //'
      met een goed gedefinieerd patroon en met. (één teken) en * (meer dan één)
      dan:
      echo «Robert: Hallo. Wijzig hier »| sed 's / Wijzigen. * //'
      Voor:
      echo «Robert: Hallo. Wijzig hier »| sed 's /. * Verander //'
      Als het ertoe doet dat het woord verschijnt
      echo «Robert: Hallo. Wijzig hier »| sed 's / Change. * / Change /'
      of uitgebreider
      in de regel met Robert wat er na verandering komt
      echo -e «Fritz: Hallo. Wijzig hier \ nRobert: Hallo. Wijzig hier »| sed '/Robert/s/Cambio.*//'
      of zoals in het begin, haal de tweede regel eruit en verwerk de rest
      echo -e «Fritz: Hallo. Wijzig hier \ nRobert: Hallo. Wijzig hier \ nOverig »| sed -e 2d -e 's / Change. * //'
      echo -e «Fritz: Hallo. Wijzig hier \ nRobert: Hallo. Wijzig hier \ nOverig »| sed '2d; s / Change. * //'

      1.    Lolo zei

        Dankjewel, het is erg nuttig voor mij.

  7.   msx zei

    Leuk artikel, waarvan ik hou, hoe geweldig de SysAdmin!
    Wat zou ons leven zijn zonder sed, awek, perl, grep, tail, head, "Emacs" en zoveel andere essentiële gereedschappen !?

  8.   Lisbeth Olarves zei

    Bedankt, het was erg nuttig.

  9.   pinnen zei

    Hallo, en hoe kun je regels 1,4, 10 en XNUMX uit een bestand met dezelfde opdracht verwijderen?