Cum să ștergeți anumite linii dintr-un fișier folosind sed

În anumite ocazii trebuie să ștergem o anumită linie dintr-un fișier sau mai multe, de exemplu, mi s-a întâmplat să am o listă întreagă de fișiere și trebuie să șterg linia # 27 din toate acestea (linia # 27 este cea a unui ACL , normă, regulă, configurare), fie pot edita fișier cu fișier, fie pot realiza ceea ce am nevoie folosind comanda sete și un script bash (opțional).

Dar, să încercăm un singur fișier oarecum simplu.

Avem dosarul distros-deb.txt care conține acest lucru:

Debian

ubuntu

ArchLinux

soluze

mentă

Cu alte cuvinte, fișierul distros-deb.txt este în care vom pune distribuțiile bazate pe Debian, dar acolo vedem că în linia # 3 există „archlinux”, o distribuție care evident nu are nimic de-a face cu Debian, așa că trebuie să eliminăm acea linie. Pentru a elimina linia # 3 a acelui fișier vom pune următoarele:

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

Explicarea acestei linii este oarecum ușoară, cu sete "3d" indicăm că vom șterge linia # 3, cu distros-deb.txt Vă indicăm pe ce fișier să lucrați, adică ștergeți linia # 3 a acestui fișier, până aici, dacă apăsați Enter, ne va arăta ce vrem, dar în terminal, deci cu > distros-deb-ok.txt indicăm faptul că, în loc să afișăm rezultatul în terminal, îl pune într-un fișier cu acest nume.

Ce este simplu?

De asemenea, putem evita utilizarea > distros-deb-ok.txt folosind un parametru adecvat de sete, parametrul -i

Adică, în cazul în care dorim să ștergem linia din fișier și să o salvăm cu același nume (și nu într-un alt fișier), pur și simplu adăugați parametrul -i :

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

Aceasta va elimina linia # 3 din distros-deb.txt și o va salva.

Ce se întâmplă dacă vreau o gamă de linii, adică să elimin linia # 3, dar și # 4 și # 5? Pentru a realiza acest lucru, punem intervalul de la 3 la 5, adică:

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

Și îmi va arăta doar debian și kubuntu 😀

Deci, dacă vreau să șterg de la linia 2 până la ultima, când nu știu liniile totale?

Folosiți doar simbolul dolar - »$

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

În cazul în care doriți să eliminați de la prima linie la # 4, atunci pur și simplu punem valoarea 1 la început:

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

Acesta a fost totul, un sfat foarte util atunci când doriți să creați scripturi bash pentru automatizarea sarcinilor și trebuie să modificați și să eliminați liniile de fișiere de configurare, pentru a modifica putem folosi sete o perl, precum și pentru a elimina știm deja cum să o facem cu sed 😉

În ceea ce priveşte


Conținutul articolului respectă principiile noastre de etică editorială. Pentru a raporta o eroare, faceți clic pe aici.

16 comentarii, lasă-le pe ale tale

Lasă comentariul tău

Adresa ta de email nu va fi publicată.

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   mss-devel el a spus

    Contribuție foarte bună 😉

    1.    KZKG ^ Gaara el a spus

      Mulțumesc

      Apropo, am primit e-mailul dvs. chiar acum vă răspund 😀

      În ceea ce priveşte

  2.   fără nume el a spus

    În calitate de mare preot al terminalului, serverelor și conexiunilor ssh vin la tine, oh, KZKG ^ Gaara, și te întreb: de unde pot obține un tutorial la nivelul ignoranței mele care îmi permite să folosesc conexiuni ssh între două mașini la distanță în rețele diferite pentru a le partaja fișiere text, pdf, imagine și sunet (mp3)….

    ????

    Serios, m-ați putea ghida în acest sens, am două mașini, una la serviciu și una acasă și am nevoie de o conexiune ssh între ele (pentru că, așa cum am înțeles, ssh permite conținutul să fie partajat între mașini, mă înșel?)
    Și dacă greșesc, ce aplicație recomandați?
    Și unde găsesc un tutorial de bază în acest sens?

    1.    -spyker- el a spus

      scp

      scp user @ machine_address: user user @ machine_address: cale.

      Aceeași sintaxă ca și cp, sursă -> destinație.

  3.   f3niX el a spus

    Ai apărut omule, ai fost pierdut.

  4.   Joaquin el a spus

    Bun sfat!

  5.   LycusHackerEmo el a spus

    Sfat interesant ... xD

    întâmplător nu cunoașteți unul care să scoată în evidență textul îndrăzneț?
    Adică, am un fișier txt care este un dicționar, are mai mult de 10000 de rânduri și vreau să evidențieze anumite texte înainte de „:” suspendarea punctelor și realizarea unu câte unul este prea mult.

    1.    KZKG ^ Gaara el a spus

      Buna,

      Un fișier txt este text simplu, așa cum sugerează și numele său ... simplu, fără formate sau ceva similar, îmi pare rău, dar cred că ceea ce cereți nu se poate face, nu-i așa? 🙁

      În ceea ce priveşte

      1.    aca el a spus

        de fapt se poate, dar ar trebui să știți formatul destinației.
        PE:
        echo $ (echo "Robert: Hello. Change here" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        este o chestiune de a face față.
        cealaltă modalitate de ștergere care poate fi utilizată este sed '/' $ 1 '/ d', dar trebuie să fii sigur de re.

        1.    LycusHackerEmo el a spus

          apoi termină de salvat în * .odt

          Nu există o modalitate mai ușoară de a face acest lucru cu LibreOffice?

  6.   Lolo el a spus

    Ați putea șterge o parte a unei linii și lăsați restul?

    Să presupunem că vreau să șterg totul în fața unui cuvânt dintr-un anumit rând.

    Sau ștergeți tot ce urmează acel cuvânt.

    1.    aca el a spus

      Da, este o chestiune de a trage o regex (dacă este necesar man sed -r, –regexp-Extended)
      Plecând de la ceea ce găsesc
      ecou «Robert: Bună ziua. Schimbați aici »| sed 's / Change //'
      cu un model bine definit și cu. (un caracter) și * (mai mult de un)
      După:
      ecou «Robert: Bună ziua. Schimbați aici »| sed 's / Change. * //'
      Inainte de:
      ecou «Robert: Bună ziua. Schimbați aici »| sed 's /. * Change //'
      Dacă contează că apare cuvântul
      ecou «Robert: Bună ziua. Schimbați aici »| sed 's / Change. * / Change /'
      sau mai elaborat
      în linia care îl conține pe Robert ce se întâmplă după Schimbare
      ecou -e «Fritz: Bună ziua. Schimbați aici \ nRobert: Bună ziua. Schimbați aici »| sed '/Robert/s/Cambio.*//'
      sau ca la început scoateți a doua linie și procesați restul
      ecou -e «Fritz: Bună ziua. Schimbați aici \ nRobert: Bună ziua. Schimbați aici \ nAlte »| sed -e 2d -e 's / Change. * //'
      ecou -e «Fritz: Bună ziua. Schimbați aici \ nRobert: Bună ziua. Schimbați aici \ nAlte »| sed '2d; s / Change. * //'

      1.    Lolo el a spus

        Mulțumesc, este foarte util.

  7.   MSX el a spus

    Frumos articol, unul dintre cele care îmi plac, cât de grozav este SysAdmin!
    Ce ar fi viața noastră fără sed, awek, perl, grep, coadă, cap, „Emacs” și atâtea alte instrumente esențiale!?

  8.   Lisbeth Ollarves el a spus

    Mulțumesc, a fost foarte util.

  9.   Ace el a spus

    Bună ziua, și cum ai putea șterge liniile 1,4 și 10 din aceeași comandă dintr-un fișier?