Cara menghapus baris tertentu dari file menggunakan sed

Pada kesempatan tertentu kita perlu menghapus baris tertentu dari satu atau beberapa file, misalnya, telah terjadi pada saya bahwa saya memiliki seluruh daftar file dan saya perlu menghapus baris # 27 dari semua ini (baris # 27 adalah dari ACL , norma, aturan, konfigurasi), apakah saya dapat mengedit file demi file atau saya hanya dapat mencapai apa yang saya butuhkan menggunakan perintah sed dan skrip bash (opsional).

Tapi, mari kita coba satu file yang agak sederhana.

Kami memiliki file tersebut distro-deb.txt yang berisi ini:

debian

kubuntu

archlinux

solus

permen

Artinya, file tersebut distro-deb.txt di mana kita akan meletakkan distro berbasis Debian, tetapi di sana kita melihat bahwa di baris # 3 ada "archlinux", distro yang jelas tidak ada hubungannya dengan Debian, jadi kita harus menghilangkan baris itu. Untuk menghilangkan baris # 3 dari file itu kami akan meletakkan yang berikut ini:

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

Menjelaskan baris ini agak mudah, dengan haus "3d" kami menunjukkan bahwa kami akan menghapus baris # 3, dengan distro-deb.txt Kami menunjukkan file apa yang akan dikerjakan, yaitu, hapus baris # 3 dari file ini, hingga di sini jika kami menekan Enter maka akan menunjukkan kepada kami apa yang kami inginkan tetapi di terminal, jadi dengan > distros-deb-ok.txt kami menunjukkan bahwa alih-alih menampilkan hasil di terminal, melainkan meletakkannya di file dengan nama ini.

Sederhana apa?

Selain itu, kita dapat menghindari penggunaan > distros-deb-ok.txt menggunakan parameter yang tepat dari sed, parameternya -i

Artinya, jika kita ingin menghapus baris dari file dan menyimpannya dengan nama yang sama (dan bukan di file lain), cukup tambahkan parameter -i :

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

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

Bagaimana jika saya menginginkan serangkaian baris, yaitu menghapus baris # 3 tetapi juga # 4 dan # 5? Untuk mencapai ini kami menempatkan rentang dari 3 hingga 5, yaitu:

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

Dan itu hanya akan menunjukkan debian dan kubuntu 😀

Jadi bagaimana jika saya ingin menghapus dari baris 2 ke baris terakhir, ketika saya tidak tahu total barisnya?

Cukup gunakan simbol dolar - »$

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

Jika Anda ingin menghilangkan dari baris pertama ke # 4 maka kami cukup memasukkan nilai 1 di awal:

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

Ini telah menjadi segalanya, tip yang sangat berguna ketika Anda ingin membuat skrip bash untuk mengotomatiskan tugas dan Anda perlu memodifikasi dan menghilangkan baris file konfigurasi, untuk memodifikasi dapat kita gunakan sed o perl, sekaligus untuk menghilangkan kita sudah tahu bagaimana melakukannya dengan sed 😉

salam


16 komentar, tinggalkan punyamu

tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   mss-devel.dll dijo

    Kontribusi yang sangat bagus 😉

    1.    KZKG ^ Gaara dijo

      Terima kasih

      Ngomong-ngomong, kami menerima emailmu sekarang, aku akan menjawabmu 😀

      salam

  2.   tanpa nama dijo

    Sebagai pendeta tinggi terminal, server, dan koneksi ssh, saya datang kepada Anda, oh hebat KZKG ^ Gaara, dan saya bertanya kepada Anda: di mana saya bisa mendapatkan tutorial pada tingkat ketidaktahuan saya yang memungkinkan saya untuk menggunakan koneksi ssh antara dua mesin jarak jauh di jaringan yang berbeda untuk dibagikan file teks, pdf, gambar dan suara (mp3)….

    🙂

    Serius, bisakah Anda membimbing saya dalam hal ini, saya memiliki dua mesin, satu di kantor dan satu di rumah dan saya memerlukan koneksi ssh di antara mereka (karena seperti yang saya pahami, ssh memungkinkan konten untuk dibagikan antar mesin, apakah saya salah?).
    Dan jika saya salah, aplikasi apa yang Anda rekomendasikan?
    Dan di mana saya bisa menemukan tutorial dasar dalam hal ini?

    1.    -spyker- dijo

      scp

      scp pengguna @ alamat_mesin: jalur pengguna @ alamat_mesin: jalur.

      Sintaks yang sama dengan cp, source -> destination.

  3.   f3niX dijo

    Anda muncul, Anda tersesat.

  4.   Joaquin dijo

    Tip bagus!

  5.   LycusHackerEmo dijo

    Tip menarik… xD

    Apakah Anda kebetulan tahu salah satu yang membuat teks tebal menonjol?
    Maksud saya, saya memiliki file txt yang merupakan kamus, memiliki lebih dari 10000 baris dan saya ingin menyorot teks tertentu sebelum titik suspensi ":" dan melakukannya satu per satu terlalu banyak.

    1.    KZKG ^ Gaara dijo

      Halo,

      File txt adalah teks biasa, sesuai dengan namanya ... polos, tanpa format atau yang serupa, saya minta maaf tapi saya rasa apa yang Anda minta tidak bisa dilakukan, bukan? 🙁

      salam

      1.    aca dijo

        sebenarnya bisa, tapi Anda harus tahu format tujuan.
        misalnya:
        echo $ (echo "Robert: Halo. Ubah di sini" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        ini masalah mengatasi.
        cara lain untuk menghapus yang dapat digunakan adalah sed '/' $ 1 '/ d' tetapi Anda harus yakin kembali.

        1.    LycusHackerEmo dijo

          lalu selesaikan menyimpannya di * .odt

          Apakah tidak ada cara yang lebih mudah untuk melakukannya dengan LibreOffice?

  6.   Lolo dijo

    Bisakah Anda menghapus sebagian dari baris dan meninggalkan sisanya?

    Katakanlah saya ingin menghapus semua yang ada di depan sebuah kata di baris tertentu.

    Atau hapus semua yang mengikuti kata itu.

    1.    aca dijo

      Ya, ini masalah menarik regex (jika perlu man sed -r, –regexp-extended)
      Mulai dari apa yang saya temukan
      echo «Robert: Halo. Ubah di sini »| sed 's / Change //'
      dengan pola yang jelas dan dengan. (satu karakter) dan * (lebih dari satu)
      Sesudah:
      echo «Robert: Halo. Ubah di sini »| sed 's / Change. * //'
      Sebelum:
      echo «Robert: Halo. Ubah di sini »| sed 's /. * Ubah //'
      Jika penting kata itu muncul
      echo «Robert: Halo. Ubah di sini »| sed 's / Change. * / Change /'
      atau lebih rumit
      di baris berisi Robert apa yang terjadi setelah Perubahan
      echo -e «Fritz: Halo. Ubah di sini \ nRobert: Halo. Ubah di sini »| sed '/Robert/s/Cambio.*//'
      atau seperti di awal, keluarkan baris kedua dan proses sisanya
      echo -e «Fritz: Halo. Ubah di sini \ nRobert: Halo. Ubah di sini \ nLainnya »| sed -e 2d -e 's / Change. * //'
      echo -e «Fritz: Halo. Ubah di sini \ nRobert: Halo. Ubah di sini \ nLainnya »| sed '2d; s / Change. * //'

      1.    Lolo dijo

        Terima kasih, ini sangat berguna bagi saya.

  7.   MSX dijo

    Artikel bagus, yang saya suka, betapa hebatnya SysAdmin!
    Apa jadinya hidup kita tanpa sed, awek, perl, grep, ekor, kepala, "Emacs" dan banyak alat penting lainnya !?

  8.   Lisbeth Olarves dijo

    Terima kasih, itu sangat membantu.

  9.   pin dijo

    Halo, dan bagaimana Anda bisa menghapus baris 1,4 dan 10 dari file dengan perintah yang sama?