Ganti teks di dalam file hanya dengan satu perintah: perl

Pada kesempatan tertentu kami ingin mengganti teks di dalam file, misalnya, perubahan Document.txt segala sesuatu yang dikatakan "keluarga saya" untuk "kita". Untuk mencapai ini, kita dapat menggunakan editor teks pilihan kita (Kate, Gedit, SublimeText, dll) tetapi selalu baik untuk mengetahui variannya, cara lain untuk mencapai hasil yang sama

Itu terjadi dengan ekspresi reguler ini dapat dicapai, perintah sed sangat bagus, memiliki varian dan opsi yang tak ada habisnya tetapi ... bagi mereka yang hanya ingin mengganti teks dari cara yang paling tidak rumit, bagi mereka, saya menghadirkan varian yang jauh lebih sederhana ini:

Mengikuti contoh, kami memiliki file Document.txt berlokasi di $ HOME / Document.txt dengan teks berikut:

(...) keluarga saya Ini seperti semuanya, seperti milik Anda atau tetangga Anda. Faktanya keluarga saya Kami mencoba untuk menjadi orang yang bertanggung jawab dan di mata masyarakat, secara politis dan sosial benar. Namun, di rumah saya ada kambing hitam, dan itulah peran saya LOL!. Saya selalu menjadi orang yang tidak takut untuk mengatakan apa yang dia pikirkan (meskipun tampaknya tidak benar di mata masyarakat), meskipun pada kenyataannya keluarga saya sudah muak dengan kotoran masyarakat saat ini.

Dengan perintah berikut, Anda akan mengubah «keluarga saya" oleh "kita":

perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt

Sesederhana itu 🙂

Jadi teksnya adalah:

(...) kita Ini seperti semuanya, seperti milik Anda atau tetangga Anda. Faktanya kita Kami mencoba untuk menjadi orang yang bertanggung jawab dan di mata masyarakat, secara politis dan sosial benar. Namun, di rumah saya ada kambing hitam, dan itulah peran saya LOL!. Saya selalu menjadi orang yang tidak takut untuk mengatakan apa yang dia pikirkan (meskipun tampaknya tidak benar di mata masyarakat), meskipun pada kenyataannya keluarga saya sudah muak dengan kotoran masyarakat saat ini.

Sintaksnya adalah:

perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar

Perintahnya mungkin tampak agak rumit, mari kita uraikan sedikit dan jelaskan sedikit lebih sederhana 😉

  • perl : Apa yang akan kami gunakan, perl
  • -pi : Pí, bagaimana π (nilai perkiraan 3.14)
  • -e : E membayangkannya untuk «e mengeksekusi» ^ - ^
  • Kemudian dalam tanda kutip » kami buka dengan s dan kami menutup dengan a g: "sg" … Bayangkan S untuk Memulai dan G untuk Game Over 😀
  • Putar di antara sg kita harus meletakkan dua set tanda kurung: [] y [], menjadi seperti itu: "S [] [] g"
  • Di dalam tanda kurung pertama seperti yang saya katakan di atas, teks yang ingin kita hapus dan ganti dengan yang baru akan masuk, sedangkan di tanda kurung kedua, teks baru yang akan dimasukkan akan masuk, mengikuti contoh: "S [keluargaku] [kita] g"

Sederhana bukan?

Penjelasannya sebenarnya jauh lebih luas daripada yang diperlukan untuk perintah, cukup sederhana untuk dipahami 🙂

Perl lebih dari sekadar cara untuk mengganti teks, ia adalah bahasa lengkap 😉

Jika Anda ingin mempelajarinya lebih lanjut, instal paketnya perl-doc dan lihat whooodo apa yang memungkinkan, itu hanya alam semesta yang berbeda.

Ngomong-ngomong dan untuk menutup, dengan asumsi Anda ingin menemukan semua file .txt yang Anda miliki di $ HOME / Documents / dan di masing-masing file ganti "my family" dengan "us", Anda dapat bergabung dengan find + perl untuk mencapai ini:

find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;

Atau menggunakan wildcard:

perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt

Masalah dengan varian kedua ini adalah tidak akan menggantikan dalam file yang ada di subfolder 🙂

Bagaimanapun, saya harap Anda menganggapnya menarik. Bagi saya ini sangat berguna, saya sudah bisa mengganti teks langsung dari terminal ... bagus! 😀


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.   Ledakan dijo

    Yah, saya pikir banyak dari kita di sini tahu perintah sed, yang melayani tujuan yang sama, itu jauh lebih baik dan lebih mudah digunakan ...

    1.    KZKG ^ Gaara dijo

      Terima kasih atas komentar Anda,
      Hanya dua detail, mengapa Anda mengatakan bahwa sed membuatnya lebih baik? Apakah benar-benar lebih mudah digunakan dengan begitu banyak karakter 'aneh'?

  2.   Federico A. Valdes Toujague dijo

    Salam untuk semua!!!. Saya telah menggunakan perintah sed, dan metode yang dijelaskan di sini dengan perl lebih sederhana. Terima kasih KZKG ^ Gaara !!!.

    1.    KZKG ^ Gaara dijo

      Terima kasih atas komentarnya 🙂
      Setidaknya menurut saya ini lebih sederhana daripada ekspresi biasa ... bahwa dengan begitu banyak karakter 'aneh', sesuatu yang sangat kompleks untuk dipahami dan dipelajari dapat dilakukan kepada mereka yang tidak paham.

      1.    giskard dijo

        Ada pepatah "lama" di luar sana: "Saya punya masalah, saya memutuskan untuk menggunakan Ekspresi Reguler ... sekarang saya punya DUA masalah" 😉

        1.    KZKG ^ Gaara dijo

          HAHAHAHAHAHAHA !!!
          Ekspresi reguler dapat menyelamatkan hidup kita pada titik tertentu ... ya, butuh waktu lama untuk mempelajari cara menggunakannya dan tidak mati saat mencoba.

          Jika saya tahu perintah ini bertahun-tahun yang lalu, Tuhan !! betapa sederhananya hidupku 😀

          1.    giskard dijo

            Bersih! Ditangani dengan baik, mereka sangat kuat 🙂 Tidak ada yang lebih baik untuk memanipulasi teks. Tapi terkadang, seperti yang Anda katakan dalam kasus Perl ini, Anda tidak perlu melangkah sejauh itu jika penggantian sudah cukup.
            Saya akan tetap menggunakan Python :)

    2.    pemburu dijo

      Tetapi dalam kehausan saya melihatnya lebih sederhana ... apakah saya melakukan sesuatu yang salah?

      sed -i "if / what-I-want-to-change / new-to-put /" file-in-which-to-replace

      1.    KZKG ^ Gaara dijo

        heh heh ... dan kalo gw mau ganti "http://my.blog.com/content/" dengan "http://my.blog.com/uploads/files/" 😀 ... sudah ada kamu punya untuk menempatkan \ dengan spasi dan lainnya, dan itu menjadi kompleks atau tidak?

        1.    pemburu dijo

          Tidak wajib menggunakan / sebagai pemisah. Lihat dengan +

          sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» file

          1.    KZKG ^ Gaara dijo

            O_O… WTF!
            Anda telah membuka banyak pilihan untuk saya sekarang .. O_O

          2.    giskard dijo

            Saya suka posting ini di mana kita semua belajar sesuatu 🙂
            Saya juga tidak tahu itu.

  3.   RAW-Dasar dijo

    Saya lebih suka menggunakan langsung vi ..

    Sesederhana:
    :% s / us / keluarga saya / g

    % -> seluruh dokumen
    s -> cari
    g -> semua kejadian

    Salam ..

    1.    KZKG ^ Gaara dijo

      Gracias!
      Saya tidak tahu bagaimana melakukannya dengan vi

  4.   st0rmt4il.dll dijo

    Ditambahkan ke favorit!

    Gracias!

  5.   badai n3 dijo
  6.   DuranG dijo

    Entri hebat! Jika ada yang tertarik, hal yang sama dengan perintah sed Linux: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Meragukan dijo

      Dan apa yang terjadi jika di dalam file yang ingin saya ganti memiliki tanda kutip?
      Contoh mengganti apa yang mengatakan teks: »1 ″ dengan teks:» 2 ″
      bagaimana perintahnya?

  7.   Percy salgado dijo

    Halo

    Saya ingin mengganti string yang memiliki @ di tengah dan hanya mengubah teks menjadi sebelum tanda di.

    teks yang berubah: Hidup Peru
    teks baru: Viva mi patria @percysalgado
    Tampil: Hidup tanah air saya

    Terima kasih atas bantuan Anda

  8.   anonim dijo

    "\" Anda harus menggunakan garis miring sebelum karakter dengan penggunaan ganda @, #, sehingga ditafsirkan sebagai teks.

  9.   Gaba dijo

    Dan bagaimana cara melakukannya di windows ????