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
vuilhedendaagse 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
vuilhedendaagse 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! 😀
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 ...
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?
Groetjes aan iedereen!!!. Ik heb het commando gebruikt dorst, en de hier beschreven methode met perl is eenvoudiger. Bedankt KZKG ^ Gaara !!!.
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.
Er is een "oud" gezegde: "Ik had een probleem, ik besloot om reguliere expressies te gebruiken ... nu heb ik TWEE problemen" 😉
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 😀
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 :)
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-
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?
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
O_O… WTF!
Je hebt nu een heel universum aan opties voor me geopend .. O_O
Ik hou van deze berichten waarin we allemaal iets leren 🙂
Ik wist dat ook niet.
Ik gebruik liever direct vi ..
Zo simpel als:
:% s / us / mijn familie / g
% -> geheel document
s -> zoeken
g -> alle gevallen
Groetjes ..
Dank je wel!
Ik wist niet hoe ik het moest doen met vi
Toegevoegd aan favorieten!
Dank je wel!
Bekijk het als je een beetje van het rpl-commando hebt
http://microbuffer.wordpress.com/2011/02/28/rpl-buscar-y-reemplazar-strings-en-linux-unix/
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
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?
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
"\" U moet de schuine streep voor de tekens gebruiken met dubbel gebruik @, #, zodat ze als tekst worden geïnterpreteerd.
En hoe doe ik het in ramen ????