En determinades ocasions desitgem reemplaçar text dins d'un arxiu, per exemple, canviar a document.txt tot el que digui «la meva família» per «nosaltres». Per aconseguir això podem utilitzar el nostre editor de text preferit (Kate, Gedit, SublimeText, etc.) però sempre és bo conèixer variants, altres formes d'aconseguir el mateix resultat 🙂
Passa que amb expressions regulars es pot aconseguir això, la comanda set és simplement magnífic, té una infinitat de variants i opcions però ... per a aquells que només volen reemplaçar text de la forma menys complexa possible, Per a ells és que porto aquesta variant molt més simple:
Seguint l'exemple, tenim l'arxiu document.txt ubicat a $ HOME / document.txt amb el següent text:
(...) la meva família és com totes, com la teva o la del teu veí. de fet la meva família intentem ser persones responsables i als ulls de la societat, políticament i socialment correctes. No obstant això, a casa meva hi ha una ovella negra, i aquest és el meu paper LOL !. Jo sempre he estat el que no té por de dir el que pensa (encara que no sigui aparentment correcte a ulls de la societat), encara que en realitat la meva família està farta de la
brutíciasocietat d'avui dia.
Amb la següent comanda canviarà «la meva família»Per«nosaltres":
perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt
Així de simple 🙂
Llavors el text seria:
(...) nosaltres és com totes, com la teva o la del teu veí. de fet nosaltres intentem ser persones responsables i als ulls de la societat, políticament i socialment correctes. No obstant això, a casa meva hi ha una ovella negra, i aquest és el meu paper LOL !. Jo sempre he estat el que no té por de dir el que pensa (encara que no sigui aparentment correcte a ulls de la societat), encara que en realitat la meva família està farta de la
brutíciasocietat d'avui dia.
La sintaxi és:
perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar
Pot semblar una mica complex la comanda, anem a desglossar una mica i explicar-ho de forma una mica més simple 😉
- perl : El que farem servir, perl
- -Pi : Pi, com π (El de valor aproximat de 3.14)
- -e : La I imagínenla de «i d'executar» ^ - ^
- Després entre cometes » obrim amb una s i tanquem amb una g: «sg» ... imaginin la S de Start (iniciar) i la G de Game Over 😀
- Al seu torn entre la sg hem de posar dos jocs de claudàtors: [] y [], Quedant així: «S [] [] g»
- Dins dels primers claudàtors com vaig dir més amunt, anirà el text que desitgem treure i reemplaçar per un de nou, mentre que en el segon joc de claudàtors anirà el nou text a posar, seguint l'exemple: «S [la meva família] [nosaltres] g»
Simplement no?
L'explicació és en realitat molt més extensa que el necessari per a la comanda, és bastant senzill d'entendre 🙂
Perl és molt, moltíssim més que una forma per reemplaçar text, és tot un llenguatge 😉
Si desitgen aprendre més d'ell instal·lin el paquet perl-doc i tirin-li un ull a toooot el que permet, simplement és un univers diferent.
Per cert i per tancar, suposant que vulguin buscar tots els fitxers .txt que tinguin en $ HOME / Documents / i en cada un reemplaçar «la meva família» per «nosaltres», es pot unir find + perl per aconseguir això:
find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;
O bé usant un comodí:
perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt
El problema amb aquesta segona variant, és que no reemplaçarà en arxius que es troben en subcarpetes 🙂
En fi, espero que l'hagin trobat interessant. Per a mi ha estat realment útil, ja puc reemplaçar text directament des de la terminal ... genial! 😀
Doncs crec que aquí molts coneixem la comanda set, que serveix per el mateix, ho fa molt millor i és més senzill d'utilitzar ...
Gràcies pel teu comentari,
Només dos detalls, per què dius que set ho fa millor? ¿De debò és més senzill d'utilitzar amb tants caràcters 'estranys'?
Salutacions a tots !!!. He utilitzat la comanda set, I el mètode descrit aquí amb perl és més senzill. Gràcies KZKG ^ Gaara !!!.
Gràcies pel comantario 🙂
Bé, al menys a mi em sembla això més simple que expressions regulars ... que amb tants caràcters 'estranys', als no coneixedors se'ls pot fer alguna cosa realment complex d'entendre i aprendre.
Diu un «vell» adagi per aquí: «Jo tenia un problema, vaig decidir utilitzar Expressions Regulars ... ara tinc DOS problemes» 😉
HAHAHAHAHAHAHA !!!
Les expressions regulars poden salvar-nos la vida en un moment determinat ... això sí, es necessita mooolt temps per aprendre a usar-les i no morir en l'intent.
Si jo hagués conegut aquesta comanda anys enrere, DÉU !! què simple hauria estat la meva vida 😀
És clar! Bé manejades són poderosíssimes 🙂 Per manipular text res millor. Però de vegades, com dius en aquest cas amb Perl, no cal anar tan lluny si un replace prou.
Jo hauria fet servir Python en tot cas 😉
Però en set jo ho veig fins més simple ... estic fent alguna cosa malament?
set -i «s / el-que-vull-canviar / el-nou-a-posar /» arxiu-en-el-qual-reemplaçar
je je ... i si vull reemplaçar «http://my.blog.com/content/» per «http://my.blog.com/uploads/files/» 😀 ... ja aquí cal posar \ amb espais i altres , i es fa complex o no?
No és obligatori fer servir / com a separador. Mira amb +
set -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» fitxer
O_O ... WTF!
Has obert tot un univers d'opcions per a mi ara .. O_O
M'encanten aquests posts on tots aprenem alguna cosa 🙂
Aquesta no me la sabia tampoc.
Prefereixo usar directament vaig veure ..
Tan simple com:
:% S / nosaltres / meva família / g
% -> tot el document
s -> buscar
g -> totes les ocurrències
Salutacions ..
Gràcies!
Amb vaig veure no sabia fer-ho
Afegit a favorits!
Gràcies!
Feu-li un visazo si teniu una estona a la comanda RPL
http://microbuffer.wordpress.com/2011/02/28/rpl-buscar-y-reemplazar-strings-en-linux-unix/
Gran entrada !, per si a algú li interessa, el mateix amb la comanda set de Linux: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
I que passa si d'aquí a l'arxiu el que vull reemplaçar té cometes?
Exemple reemplaçar el que diu text: »1" per text: »2"
com seria la comanda?
Hola
Vaig voler reemplaçar una cadena que tenia una @ al mig i només canviava el text pel abans de l'arrova.
text a canviar: Visca el Perú
nou text: Visca la meva pàtria @percysalgado
Es mostra: Visca la meva pàtria
Gràcies per la teva ajuda
«\» Cal utilitzar la barra davant dels caràcters amb doble ús @, #, perquè així siguin interpretats com a text.
I com ho faig en windows ????