Sådan slettes specifikke linjer fra en fil ved hjælp af sed

Ved visse lejligheder er vi nødt til at slette en bestemt linje fra en fil eller flere, for eksempel er det sket for mig, at jeg har haft en hel liste med filer, og jeg skal slette linje nr. 27 af alle disse (linje nr. 27 er en ACL , norm, regel, konfiguration), kan jeg enten redigere fil for fil, eller jeg kan bare opnå det, jeg har brug for ved hjælp af sed og et bash-script (valgfrit).

Men lad os prøve en enkelt fil noget enkel.

Vi har filen distros-deb.txt som indeholder dette:

debian

Kubuntu

ArchLinux

soluses

mynte

Med andre ord filen distros-deb.txt er det sted, hvor vi vil placere de Debian-baserede distroer, men der ser vi, at der i linje nr. 3 er "archlinux", en distro, der tydeligvis ikke har noget med Debian at gøre, så vi skal fjerne den linje. For at fjerne linje nr. 3 i den fil vil vi sætte følgende:

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

At forklare denne linje er noget let, med tørstig "3d" vi indikerer, at vi sletter linje # 3 med distros-deb.txt Vi angiver, hvilken fil vi skal arbejde på, det vil sige linie nr. 3 i denne fil, indtil her, hvis vi trykker på Enter, vil det vise os, hvad vi vil have, men i terminalen, så med > distros-deb-ok.txt vi indikerer, at i stedet for at vise resultatet i terminalen, skal du lægge det i en fil med dette navn.

Hvad er simpelt?

Vi kan også undgå at bruge > distros-deb-ok.txt ved hjælp af en korrekt parameter for sed, parameteren -i

Hvis vi ønsker at fjerne linjen fra filen og gemme den med samme navn (og ikke i en anden fil), skal du blot tilføje parameteren -i :

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

Dette fjerner linje nr. 3 fra distros-deb.txt og gemmer den.

Hvad hvis jeg vil have en række linjer, det vil sige at fjerne linje nr. 3, men også nr. 4 og nr. 5? For at opnå dette sætter vi området fra 3 til 5, det vil sige:

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

Og det viser mig kun debian og kubuntu 😀

Så hvad hvis jeg vil slette fra linje 2 til den sidste, når jeg ikke kender de samlede linjer?

Brug bare dollarsymbolet - »$

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

Hvis du vil fjerne fra første linje til nr. 4, sætter vi simpelthen værdien 1 i starten:

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

Dette har været alt, et meget nyttigt tip, når du vil lave bash-scripts til at automatisere opgaver, og du skal ændre og fjerne linjer med konfigurationsfiler, for at ændre kan vi bruge sed o perl, såvel som for at eliminere, ved vi allerede, hvordan man gør det med sed 😉

hilsen


Indholdet af artiklen overholder vores principper for redaktionel etik. Klik på for at rapportere en fejl her.

16 kommentarer, lad dine

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   mss-udvikling sagde han

    Meget godt bidrag 😉

    1.    KZKG ^ Gaara sagde han

      Tak

      Forresten, vi modtog din e-mail lige nu, jeg svarer dig 😀

      hilsen

  2.   navnløs sagde han

    Som ypperstepræst for terminalen, servere og ssh-forbindelser kommer jeg til dig, åh store KZKG ^ Gaara, og jeg spørger dig: hvor kan jeg få en tutorial på niveau med min uvidenhed, der giver mig mulighed for at bruge ssh-forbindelser mellem to eksterne maskiner på forskellige netværk til at dele tekstfiler, pdf, billede og lyd (mp3)….

    🙂

    Seriøst, kan du guide mig i denne henseende, jeg har to maskiner, en på arbejde og en derhjemme, og jeg har brug for en ssh-forbindelse mellem dem (for som jeg forstår det, tillader ssh, at indhold kan deles mellem maskiner, har jeg ret?
    Og hvis jeg tager fejl, hvilken applikation anbefaler du?
    Og hvor finder jeg en grundlæggende tutorial i denne henseende?

    1.    -spyker- sagde han

      scp.

      scp bruger @ machine_address: sti bruger @ machine_address: sti.

      Samme syntaks som cp, kilde -> destination.

  3.   F3niX sagde han

    Du dukkede op mand, du var vild.

  4.   Joaquin sagde han

    Godt tip!

  5.   LycusHackerEmo sagde han

    Interessant tip ... xD

    tilfældigvis kender du ikke en der får fed skrift til at skille sig ud?
    Jeg mener, jeg har en txt-fil, der er en ordbog, den har mere end 10000 linjer, og jeg vil have den til at fremhæve bestemt tekst før ":" -opslæmningspunkterne og at gøre det en efter en er for meget.

    1.    KZKG ^ Gaara sagde han

      Hej,

      En txt-fil er almindelig tekst, som navnet antyder ... ren, uden formater eller noget lignende, jeg er ked af, men jeg tror, ​​at det, du beder om, ikke kan gøres, kan det? 🙁

      hilsen

      1.    aca sagde han

        faktisk kan det, men du bliver nødt til at kende destinationsformatet.
        f.eks:
        echo $ (echo "Robert: Hej. Skift her" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        det er et spørgsmål om at klare det.
        den anden måde at slette, der kan bruges, er sed '/' $ 1 '/ d', men du skal være sikker på re.

        1.    LycusHackerEmo sagde han

          gem derefter den i * .odt

          Er der ikke en lettere måde at gøre det på med LibreOffice?

  6.   Lolo sagde han

    Kunne du slette en del af en linje og lade resten være?

    Lad os sige, at jeg vil slette alt foran et ord i en bestemt række.

    Eller slet alt, der følger ordet.

    1.    aca sagde han

      Ja, det er et spørgsmål om at trække en regex (om nødvendigt mand sed -r, –regexp-forlænget)
      Fra det, jeg finder ud af
      ekko «Robert: Hej. Skift her »| sed 's / Skift //'
      med et veldefineret mønster og med. (et tegn) og * (mere end et)
      derefter:
      ekko «Robert: Hej. Skift her »| sed 's / Skift. * //'
      før:
      ekko «Robert: Hej. Skift her »| sed 's /. * Skift //'
      Hvis det betyder noget, at ordet vises
      ekko «Robert: Hej. Skift her »| sed 's / Skift. * / Skift /'
      eller mere detaljeret
      i linjen, der indeholder Robert, hvad der går efter Change
      ekko -e «Fritz: Hej. Skift her \ nRobert: Hej. Skift her »| sed '/Robert/s/Cambio.*//'
      eller som i begyndelsen tage den anden linje ud og behandle resten
      ekko -e «Fritz: Hej. Skift her \ nRobert: Hej. Skift her \ nAndet »| sed -e 2d -e 's / Skift. * //'
      ekko -e «Fritz: Hej. Skift her \ nRobert: Hej. Skift her \ nAndet »| sed '2d; s / Skift. * //'

      1.    Lolo sagde han

        Tak, det er meget nyttigt for mig.

  7.   MSX sagde han

    Dejlig artikel, som jeg godt kan lide, hvor stor SysAdmin!
    Hvad ville vores liv være uden sed, awek, perl, grep, hale, hoved, "Emacs" og så mange andre vigtige værktøjer!?

  8.   Lisbeth Ollarves sagde han

    Tak, det var meget nyttigt.

  9.   Perni sagde han

    Hej, og hvordan kunne du slette linje 1,4 og 10 i den samme kommando fra en fil?