Cara menghapus baris tertentu dari fail menggunakan sed

Pada masa-masa tertentu, kita perlu menghapus baris tertentu dari satu fail atau beberapa fail, misalnya, telah terjadi pada saya bahawa saya mempunyai senarai keseluruhan fail dan saya perlu menghapus baris # 27 dari semua ini (baris # 27 adalah dari ACL , norma, peraturan, konfigurasi), saya boleh mengedit fail mengikut fail atau saya dapat mencapai apa yang saya perlukan menggunakan perintah sed dan skrip bash (pilihan).

Tetapi, mari kita cuba satu fail yang agak mudah.

Kami mempunyai fail distros-deb.txt yang mengandungi ini:

Debian

kubuntu

archlinux

solus

pudina

Dengan kata lain, fail tersebut distros-deb.txt adalah di mana kita akan meletakkan distro berdasarkan Debian, tetapi di sana kita melihat bahawa di baris # 3 ada "archlinux", distro yang jelas tidak ada kaitan dengan Debian, jadi kita mesti menghilangkan garis itu. Untuk menghilangkan baris # 3 fail itu, kami akan meletakkan perkara berikut:

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

Menjelaskan garis ini agak mudah, dengan dahaga "3d" kami menunjukkan bahawa kami akan menghapus baris # 3, dengan distros-deb.txt Kami menunjukkan fail apa yang harus dikerjakan, iaitu, hapus baris # 3 fail ini, sampai di sini jika kita tekan Enter, itu akan menunjukkan kepada kita apa yang kita mahukan tetapi di terminal, jadi dengan > distros-deb-ok.txt kami menunjukkan bahawa bukannya menunjukkan hasilnya di terminal, tetapi meletakkannya dalam fail dengan nama ini.

Apa yang mudah?

Kita juga boleh mengelakkan penggunaan > distros-deb-ok.txt menggunakan parameter tepat dari sed, parameter -i

Maksudnya, sekiranya kita ingin menghapus baris dari fail dan menyimpannya dengan nama yang sama (dan bukan dalam fail lain), cukup tambahkan parameter -i :

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

Ini akan mengeluarkan baris # 3 dari distros-deb.txt dan menyimpannya.

Bagaimana jika saya mahukan pelbagai baris, iaitu untuk membuang baris # 3 tetapi juga # 4 dan # 5? Untuk mencapai ini, kami meletakkan jarak antara 3 hingga 5, iaitu:

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

Dan ia akan menunjukkan kepada saya hanya debian dan kubuntu 😀

Jadi bagaimana jika saya ingin memadam dari baris 2 hingga baris terakhir, apabila saya tidak mengetahui jumlah barisnya?

Cukup gunakan simbol dolar - »$

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

Sekiranya anda ingin menghilangkan dari baris pertama hingga # 4 maka kami hanya meletakkan nilai 1 pada awal:

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

Ini adalah segalanya, tip yang sangat berguna ketika anda ingin membuat skrip bash untuk mengotomatisasi tugas dan anda perlu mengubah dan menghilangkan baris fail konfigurasi, untuk mengubahsuai yang dapat kita gunakan sed o perl, serta untuk menghilangkan kita sudah tahu bagaimana melakukannya dengan sed 😉

salam


Kandungan artikel mematuhi prinsip kami etika editorial. Untuk melaporkan ralat, klik di sini.

16 komen, tinggalkan komen anda

Tinggalkan komen anda

Alamat email anda tidak akan disiarkan.

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.

  1.   mss-devel kata

    Sumbangan yang sangat baik 😉

    1.    KZKG ^ Gaara kata

      Terima kasih

      By the way, kami telah menerima e-mel anda sekarang saya akan menjawab anda 😀

      salam

  2.   tidak bernama kata

    Sebagai imam utama terminal, pelayan dan sambungan ssh saya datang kepada anda, oh KZKG ^ Gaara yang hebat, dan saya bertanya kepada anda: di mana saya boleh mendapatkan tutorial pada tahap ketidaktahuan saya yang membolehkan saya menggunakan sambungan ssh antara dua mesin jauh di rangkaian yang berbeza untuk dikongsi fail teks, pdf, gambar dan suara (mp3)….

    (I.e.

    Serius, bolehkah anda membimbing saya dalam hal ini, saya mempunyai dua mesin, satu di tempat kerja dan satu di rumah dan saya memerlukan sambungan ssh di antara mereka (kerana seperti yang saya faham, ssh membenarkan kandungan untuk dikongsi antara mesin, adakah saya betul?)
    Dan jika saya salah, aplikasi apa yang anda cadangkan?
    Dan di mana saya dapati tutorial asas dalam hal ini?

    1.    -pengintip- kata

      scp

      pengguna scp @ machine_address: user path @ machine_address: path.

      Sintaks yang sama dengan cp, sumber -> destinasi.

  3.   F3niX kata

    Anda muncul lelaki, anda tersesat.

  4.   Joaquin kata

    Petua Baik!

  5.   LycusHackerEmo kata

    Petua menarik… xD

    Adakah anda tahu yang membuat teks tebal menonjol?
    Maksud saya, saya mempunyai fail txt yang merupakan kamus, ia mempunyai lebih daripada 10000 baris dan saya mahu ia menonjolkan teks tertentu sebelum titik penggantungan ":" dan melakukannya satu demi satu terlalu banyak.

    1.    KZKG ^ Gaara kata

      Hello,

      Fail txt adalah teks biasa, seperti namanya ... polos, tanpa format atau yang serupa, saya minta maaf tetapi saya rasa apa yang anda minta tidak dapat dilakukan, boleh? 🙁

      salam

      1.    aca kata

        sebenarnya boleh, tetapi anda harus mengetahui format destinasi.
        cth:
        echo $ (echo "Robert: Hello. Tukar di sini" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        ia adalah masalah untuk mengatasi.
        cara lain untuk menghapuskan yang boleh digunakan adalah sed '/' $ 1 '/ d' tetapi anda harus yakin dengan semula.

        1.    LycusHackerEmo kata

          kemudian selesai menyimpannya di * .odt

          Tidak ada cara yang lebih mudah untuk melakukannya dengan LibreOffice?

  6.   Lolo kata

    Bolehkah anda menghapus sebahagian daripada baris dan meninggalkan yang lain?

    Katakan saya mahu memadamkan semua yang ada di hadapan perkataan dalam baris tertentu.

    Atau padamkan semua yang mengikuti perkataan itu.

    1.    aca kata

      Ya, ini adalah masalah menarik regex (jika perlu lelaki sed -r, –regexp-diperpanjang)
      Bermula dari apa yang saya dapati
      gema «Robert: Helo. Tukar di sini »| sed / Perubahan // '
      dengan corak yang jelas dan dengan. (satu watak) dan * (lebih daripada satu)
      Selepas:
      gema «Robert: Helo. Tukar di sini »| sed / Perubahan. * // '
      Sebelum:
      gema «Robert: Helo. Tukar di sini »| sed /. * Tukar // '
      Sekiranya penting, perkataan itu muncul
      gema «Robert: Helo. Tukar di sini »| sed / Perubahan. * / Tukar / '
      atau lebih terperinci
      dalam baris yang mengandungi Robert apa yang berlaku selepas Perubahan
      echo -e «Fritz: Helo. Tukar di sini \ nRobert: Helo. Tukar di sini »| sed '/Robert/s/Cambio.*//'
      atau seperti pada permulaan mengeluarkan baris kedua dan memproses selebihnya
      echo -e «Fritz: Helo. Tukar di sini \ nRobert: Helo. Tukar di sini \ nLainnya »| sed -e 2d -e / Perubahan. * // '
      echo -e «Fritz: Helo. Tukar di sini \ nRobert: Helo. Tukar di sini \ nLainnya »| sed '2d; s / Tukar. * //'

      1.    Lolo kata

        Terima kasih, ia sangat berguna untuk saya.

  7.   MSX kata

    Artikel yang bagus, yang saya suka, betapa hebatnya SysAdmin!
    Bagaimana kehidupan kita tanpa sed, awek, perl, grep, tail, head, "Emacs" dan banyak lagi alat penting lain !?

  8.   Lisbeth Ollarves kata

    Terima kasih, ia sangat membantu.

  9.   Perni kata

    Halo, dan bagaimana anda boleh menghapus baris 1,4 dan 10 dari fail dalam arahan yang sama?