Vervang tekst in bestanden met slechts één commando: perl

In bepaalde gevallen willen we tekst in een bestand vervangen, bijvoorbeeld wijzigen in Document.txt alles wat 'mijn familie' voor 'ons' zegt. Om dit te bereiken kunnen we onze favoriete teksteditor gebruiken (Kate, Gedit, SublimeText, enz.), Maar het is altijd goed om varianten te kennen, andere manieren om hetzelfde resultaat te bereiken 🙂

Het gebeurt dat met normale uitdrukkingen dit kan worden bereikt, het sed-commando is gewoon prachtig, het heeft eindeloze varianten en opties, maar ... voor degenen die gewoon tekst uit de minst complexe manier mogelijk, voor hen is het dat ik deze veel eenvoudigere variant breng:

Volgens het voorbeeld hebben we het bestand Document.txt in $ HOME / Document.txt met de volgende tekst:

(...) mijn familie het is zoals ze allemaal, zoals die van jou of die van je buren. In feite mijn familie We proberen verantwoordelijke mensen te zijn en in de ogen van de samenleving politiek en sociaal correct. In mijn huis is er echter een zwart schaap, en dat is mijn rol LOL!. Ik ben altijd degene geweest die niet bang is om te zeggen wat hij denkt (hoewel het blijkbaar niet correct is in de ogen van de samenleving), hoewel mijn familie in werkelijkheid genoeg heeft van de vuil hedendaagse samenleving.

Met het volgende commando verander je «mijn familie" door "ons":

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

Zo simpel is het 🙂

Dus de tekst zou zijn:

(...) ons het is zoals ze allemaal, zoals die van jou of die van je buren. In feite ons We proberen verantwoordelijke mensen te zijn en in de ogen van de samenleving politiek en sociaal correct. In mijn huis is er echter een zwart schaap, en dat is mijn rol LOL!. Ik ben altijd degene geweest die niet bang is om te zeggen wat hij denkt (hoewel het blijkbaar niet correct is in de ogen van de samenleving), hoewel mijn familie in werkelijkheid genoeg heeft van de vuil hedendaagse samenleving.

De syntaxis is:

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

Het commando lijkt misschien wat ingewikkeld, laten we het een beetje opsplitsen en het een beetje eenvoudiger uitleggen 😉

  • perl : Wat we zullen gebruiken, perl
  • -pi : Pí, hoe π (de geschatte waarde van 3.14)
  • -e : De E stelt zich voor dat «e uitvoert» ^ - ^
  • Dan tussen aanhalingstekens » we openen met een s en we sluiten af ​​met een g: "sg" … Stel je de S voor Start en de G voor Game Over 😀 voor
  • Draai tussen de sg we moeten twee sets haakjes plaatsen: [] y [], op die manier: "S [] [] g"
  • Binnen de eerste haakjes, zoals ik hierboven al zei, zal de tekst die we willen verwijderen en vervangen door een nieuwe gaan, terwijl in de tweede set haakjes de nieuwe tekst die moet worden geplaatst verdwijnt, volgens het voorbeeld: "S [mijn familie] [wij] g"

Simpel is het niet?

De uitleg is eigenlijk veel uitgebreider dan wat nodig is voor het commando, het is vrij eenvoudig te begrijpen 🙂

Perl is veel, veel meer dan een manier om tekst te vervangen, het is een hele taal 😉

Installeer het pakket als u er meer over wilt weten perl-doc en kijk eens naar whooodo wat het toelaat, het is gewoon een ander universum.

Ter afsluiting, ervan uitgaande dat je alle .txt-bestanden wilt vinden die je in $ HOME / Documents / hebt en in elk bestand "mijn familie" vervangt door "ons", kun je je bij find + perl aansluiten om dit te bereiken:

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

Of gebruik een jokerteken:

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

Het probleem met deze tweede variant is dat het niet zal worden vervangen in bestanden die zich in submappen 🙂 bevinden

Hoe dan ook, ik hoop dat je het interessant vond. Voor mij was het erg handig, ik kan tekst al rechtstreeks vanaf de terminal vervangen ... geweldig! 😀


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   Boom zei

    Nou, ik denk dat velen van ons hier het sed-commando kennen, dat hetzelfde doel dient, het veel beter maakt en gemakkelijker te gebruiken is ...

    1.    KZKG ^ Gaara zei

      Bedankt voor je reactie,
      Slechts twee details, waarom zeg je dat sed het beter maakt? Is het echt gemakkelijker te gebruiken met zoveel 'rare' karakters?

  2.   Federico A. Valdes Toujague zei

    Groetjes aan iedereen!!!. Ik heb het commando gebruikt dorst, en de hier beschreven methode met perl is eenvoudiger. Bedankt KZKG ^ Gaara !!!.

    1.    KZKG ^ Gaara zei

      Bedankt voor de reactie 🙂
      Nou, het lijkt me tenminste dat dit eenvoudiger is dan reguliere expressies ... dat met zoveel 'rare' karakters, iets heel ingewikkelds om te begrijpen en te leren kan worden gedaan aan de niet-gewiekste.

      1.    giskard zei

        Er is een "oud" gezegde: "Ik had een probleem, ik besloot om reguliere expressies te gebruiken ... nu heb ik TWEE problemen" 😉

        1.    KZKG ^ Gaara zei

          HAHAHAHAHAHAHA !!!
          Reguliere uitdrukkingen kunnen ons leven op een gegeven moment redden ... ja, het duurt lang voordat we leren hoe we ze moeten gebruiken en niet proberen te sterven.

          Als ik dit gebod jaren geleden had gekend, GOD !! hoe eenvoudig zou mijn leven zijn geweest 😀

          1.    giskard zei

            Doorzichtig! Goed behandeld, ze zijn erg krachtig 🙂 Niets beters om tekst te manipuleren. Maar soms, zoals u in dit geval met Perl zegt, hoeft u niet zo ver te gaan als vervanging voldoende is.
            Ik zou Python toch hebben gebruikt :)

    2.    djager zei

      Maar in dorst zie ik het nog eenvoudiger ... doe ik iets verkeerd?

      sed -i "if / wat-ik-wil-veranderen / wat-nieuw-te-plaatsen /" bestand-in-dat-te-vervangen-

      1.    KZKG ^ Gaara zei

        heh heh ... en als ik "http://my.blog.com/content/" wil vervangen door "http://my.blog.com/uploads/files/" 😀 ... je hebt er al om \ met spaties en andere te plaatsen, en het wordt complex of niet?

        1.    djager zei

          Het is niet verplicht om / als scheidingsteken te gebruiken. Kijk met +

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

          1.    KZKG ^ Gaara zei

            O_O… WTF!
            Je hebt nu een heel universum aan opties voor me geopend .. O_O

          2.    giskard zei

            Ik hou van deze berichten waarin we allemaal iets leren 🙂
            Ik wist dat ook niet.

  3.   RAW-Basis zei

    Ik gebruik liever direct vi ..

    Zo simpel als:
    :% s / us / mijn familie / g

    % -> geheel document
    s -> zoeken
    g -> alle gevallen

    Groetjes ..

    1.    KZKG ^ Gaara zei

      Dank je wel!
      Ik wist niet hoe ik het moest doen met vi

  4.   st0rmt4il zei

    Toegevoegd aan favorieten!

    Dank je wel!

  5.   n3storm zei
  6.   DuranG zei

    Geweldige instap! Voor het geval iemand geïnteresseerd is, hetzelfde met het Linux sed-commando: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Twijfelen zei

      En wat gebeurt er als in het bestand wat ik wil vervangen aanhalingstekens bevat?
      Voorbeeld vervang wat zegt tekst: »1 ″ door tekst:» 2 ″
      hoe zou het commando zijn?

  7.   Percy salgado zei

    hallo

    Ik wilde een string vervangen met een @ in het midden en veranderde alleen de tekst in de voor de at.

    tekst om te veranderen: Viva el Perú
    nieuwe tekst: Viva mi patria @percysalgado
    Getoond: Lang leve mijn vaderland

    Bedankt voor je hulp

  8.   anoniem zei

    "\" U moet de schuine streep voor de tekens gebruiken met dubbel gebruik @, #, zodat ze als tekst worden geïnterpreteerd.

  9.   Gaba zei

    En hoe doe ik het in ramen ????