Palitan ang teksto sa loob ng mga file ng isang utos lamang: perl

Sa ilang mga okasyon nais naming palitan ang teksto sa loob ng isang file, halimbawa, baguhin sa Dokumento.txt lahat ng sinasabi ng "aking pamilya" para sa "amin." Upang makamit ito maaari naming gamitin ang aming ginustong text editor (Kate, Gedit, SublimeText, atbp) ngunit palaging mahusay na malaman ang mga variant, iba pang mga paraan upang makamit ang parehong resulta 🙂

Nangyayari iyon sa regular na expression maaari mo itong makamit, ang utos na sed ay kahanga-hanga, mayroon itong walang katapusang mga pagkakaiba-iba at mga pagpipilian ngunit ... para sa mga nais lamang palitan ang teksto mula sa hindi gaanong kumplikadong paraan hangga't maaari, para sa kanila ay dinala ko ang mas simpleng uri na ito:

Kasunod sa halimbawa, mayroon kaming file Dokumento.txt matatagpuan sa $ HOME / Document.txt kasama ang sumusunod na teksto:

(...) ang aking pamilya Ito ay tulad ng kanilang lahat, tulad ng sa iyo o sa iyong kapit-bahay. Sa totoo lang ang aking pamilya Sinusubukan naming maging responsable na mga tao at sa mata ng lipunan, tama sa pampulitika at panlipunan. Gayunpaman, sa aking bahay mayroong isang itim na tupa, at iyon ang aking tungkulin LOL!. Palagi akong naging isa na hindi natatakot na sabihin kung ano ang iniisip niya (kahit na ito ay tila hindi tama sa mga mata ng lipunan), kahit na sa totoo lang ang aking pamilya ay nagsawa na dumi lipunan ngayon.

Sa sumusunod na utos magbabago ka «ang aking pamilya"ni"kami":

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

Ganon lang kasimple

Kaya't ang teksto ay magiging:

(...) kami Ito ay tulad ng kanilang lahat, tulad ng sa iyo o sa iyong kapit-bahay. Sa totoo lang kami Sinusubukan naming maging responsable na mga tao at sa mata ng lipunan, tama sa pampulitika at panlipunan. Gayunpaman, sa aking bahay mayroong isang itim na tupa, at iyon ang aking tungkulin LOL!. Palagi akong naging isa na hindi natatakot na sabihin kung ano ang iniisip niya (kahit na ito ay tila hindi tama sa mga mata ng lipunan), kahit na sa totoo lang ang aking pamilya ay nagsawa na dumi lipunan ngayon.

Ang syntax ay:

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

Ang utos ay maaaring mukhang medyo kumplikado, paghiwalayin natin ito nang kaunti at ipaliwanag ito nang kaunti nang mas simple 😉

  • perlas : Ang gagamitin namin, perl
  • -pi : Pí, paano π (ang tinatayang halaga ng 3.14)
  • -e : Ang E akala ito para sa «e upang maisagawa» ^ - ^
  • Pagkatapos sa mga quote » buksan namin sa a s at nagsasara kami ng a g: "sg" … Isipin ang S para sa Pagsisimula at ang G para sa Game Over 😀
  • Lumiko sa pagitan ng sg dapat kaming maglagay ng dalawang hanay ng mga braket: [] y [], pagiging ganoon: "S [] [] g"
  • Sa loob ng mga unang braket tulad ng sinabi ko sa itaas, ang teksto na nais naming alisin at palitan ng bago ay pupunta, habang sa pangalawang hanay ng mga bracket ang bagong teksto na ilalagay ay mapupunta, sumusunod sa halimbawa: "S [aking pamilya] [kami] g"

Simple di ba?

Ang paliwanag ay talagang mas malawak kaysa sa kung ano ang kinakailangan para sa utos, ito ay medyo simple upang maunawaan 🙂

Ang Perl ay marami, higit pa sa isang paraan upang mapalitan ang teksto, ito ay isang buong wika 😉

Kung nais mong matuto nang higit pa tungkol dito, i-install ang package perl-doc at tingnan ang whooodo kung ano ang pinapayagan nito, ibang uniberso lang ito.

Sa pamamagitan ng paraan at upang isara, ipagpapalagay na nais mong hanapin ang lahat ng mga .txt file na mayroon ka sa $ HOME / Documents / at sa bawat isa palitan ang "aking pamilya" ng "amin", maaari kang sumali sa hanapin + perl upang makamit ito:

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

O gumagamit ng isang wildcard:

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

Ang problema sa pangalawang variant na ito ay hindi nito papalitan ang mga file na nasa mga subfolder 🙂

Gayunpaman, sana ay nahanap mo itong kawili-wili. Para sa akin talagang kapaki-pakinabang ito, mapapalitan ko nang direkta ang teksto mula sa terminal ... mahusay! 😀


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   pagbubunsod dijo

    Sa gayon, sa palagay ko marami sa atin dito ang nakakaalam ng utos ng sed, na nagsisilbi ng parehong layunin, ginagawa itong mas mahusay at mas madaling gamitin ...

    1.    KZKG ^ Gaara dijo

      Salamat sa pahayag mo,
      Dalawang detalye lamang, bakit mo nasabi na ang sed ay nagpapabuti nito? Mas madaling gamitin ba ito sa maraming mga 'kakatwang' character?

  2.   Federico A. Valdes Toujague dijo

    Pagbati sa lahat !!!. Nagamit ko na ang utos uhaw, at ang pamamaraang inilarawan dito na may perl ay mas simple. Salamat KZKG ^ Gaara !!!.

    1.    KZKG ^ Gaara dijo

      Salamat sa komento 🙂
      Sa totoo lang, para sa akin ito ay mas simple kaysa sa regular na mga expression ... na sa maraming mga 'kakatwang' character, isang bagay na talagang kumplikado upang maunawaan at matutunan ay maaaring gawin sa hindi marunong.

      1.    giskard dijo

        Mayroong isang «luma» na kasabihan doon: «Nagkaroon ako ng isang problema, nagpasya akong gumamit ng Mga Regular na Ekspresyon ... ngayon mayroon akong DALAWANG problema» 😉

        1.    KZKG ^ Gaara dijo

          HAHAHAHAHAHAHA !!!
          Ang mga regular na expression ay maaaring mai-save ang aming mga buhay sa isang tiyak na punto ... oo, ito ay tumatagal ng mahabang oras upang malaman kung paano gamitin ang mga ito at hindi mamatay sinusubukan.

          Kung alam ko ang utos na ito taon na ang nakakalipas, DIYOS !! kung gaano kasimple ang buhay ko 😀

          1.    giskard dijo

            Malinaw! Mahusay na hawakan, napakalakas nila 🙂 Walang mas mahusay na manipulahin ang teksto. Ngunit kung minsan, tulad ng sinasabi mo sa kasong ito kay Perl, hindi mo na kailangang lumayo sa ganoon kung sapat na ang isang kapalit.
            Gagamitin ko sana ang Python :)

    2.    dhunter dijo

      Ngunit sa uhaw nakikita ko itong mas simple ... may mali ba akong ginagawa?

      sed -i "yes / what-I-want-to-change / new-to-put /" file-in-which-to-replacement

      1.    KZKG ^ Gaara dijo

        heh heh ... at kung nais kong palitan ang "http://my.blog.com/content/" ni "http://my.blog.com/uploads/files/" 😀 ... nandiyan ka na bang maglagay ng \ mga puwang at iba pa , at ito ay naging kumplikado o hindi?

        1.    dhunter dijo

          Hindi ipinag-uutos na gamitin / bilang isang separator. Tumingin kasama si +

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

          1.    KZKG ^ Gaara dijo

            O_O… WTF!
            Binuksan mo ang isang buong uniberso ng mga pagpipilian para sa akin ngayon .. O_O

          2.    giskard dijo

            Gusto ko ang mga post na ito kung saan lahat tayo ay may natutunan something
            Hindi ko din alam yun.

  3.   Batas-Batayan dijo

    Mas gusto kong gamitin nang direkta vi ..

    Kasing simple ng:
    :% s / us / aking pamilya / g

    % -> buong dokumento
    s -> paghahanap
    g -> lahat ng mga pangyayari

    Pagbati ...

    1.    KZKG ^ Gaara dijo

      Salamat sa iyo!
      Hindi ko alam kung paano gawin ito sa vi

  4.   st0rmt4il dijo

    Naidagdag sa mga paborito!

    Salamat sa iyo!

  5.   n3bagyo dijo
  6.   DuranG dijo

    Mahusay na pagpasok! Kung sakaling may interesado, pareho sa utos ng Linux sed: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Pagdududa dijo

      At ano ang mangyayari kung sa loob ng file ang nais kong palitan ay may mga quote?
      Halimbawa palitan ang sinasabi ng teksto: »1 ″ sa pamamagitan ng teksto:» 2 ″
      paano ang utos?

  7.   Percy salgado dijo

    Hello

    Nais kong palitan ang isang string na mayroong isang @ sa gitna at binago lamang ang teksto ng bago ang sa.

    teksto upang baguhin: Mabuhay ang Peru
    bagong teksto: Viva mi patria @percysalgado
    Ipinakita: Mabuhay ang aking bayan

    Salamat sa iyong tulong

  8.   Hindi kilala dijo

    "\" Dapat mong gamitin ang slash bago ang mga character na may doble na paggamit @, #, upang ang mga ito ay mabigyan ng kahulugan bilang teksto.

  9.   Gaba dijo

    At paano ko ito gagawin sa windows ????