In alcune occasioni vogliamo sostituire il testo all'interno di un file, ad esempio, cambiare in Document.txt tutto quello che "la mia famiglia" dice per "noi". Per ottenere ciò possiamo utilizzare il nostro editor di testo preferito (Kate, Gedit, SublimeText, ecc.) Ma è sempre bene conoscere varianti, altri modi per ottenere lo stesso risultato 🙂
Succede che con espressioni regolari puoi ottenere questo, il comando sed è semplicemente magnifico, ha infinite varianti e opzioni ma ... per coloro che vogliono solo sostituire il testo dal modo meno complesso possibile, per loro è che porto questa variante molto più semplice:
Seguendo l'esempio, abbiamo il file Document.txt situato in $ HOME / Document.txt con il seguente testo:
(...) la mia famiglia È come tutti loro, come il tuo o il tuo vicino. Infatti la mia famiglia Cerchiamo di essere persone responsabili e agli occhi della società, politicamente e socialmente corretti. Tuttavia, a casa mia c'è una pecora nera, e questo è il mio ruolo LOL!. Sono sempre stato quello che non ha paura di dire quello che pensa (anche se apparentemente non è corretto agli occhi della società), anche se in realtà la mia famiglia è stufo del
sporciziasocietà odierna.
Con il seguente comando cambierai «la mia famiglia"di"noi":
perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt
È così semplice 🙂
Quindi il testo sarebbe:
(...) noi È come tutti loro, come il tuo o il tuo vicino. Infatti noi Cerchiamo di essere persone responsabili e agli occhi della società, politicamente e socialmente corretti. Tuttavia, a casa mia c'è una pecora nera, e questo è il mio ruolo LOL!. Sono sempre stato quello che non ha paura di dire quello che pensa (anche se apparentemente non è corretto agli occhi della società), anche se in realtà la mia famiglia è stufo del
sporciziasocietà odierna.
La sintassi è:
perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar
Il comando può sembrare un po 'complesso, analizziamolo un po' e spieghiamo un po 'più semplicemente 😉
- perl : Cosa useremo, perl
- -pi : Pí, come π (il valore approssimativo di 3.14)
- -e : La E lo immagina per «e da eseguire» ^ - ^
- Quindi tra virgolette » apriamo con a s e chiudiamo con a g: "sg" ... Immagina la S per Start e la G per Game Over 😀
- Girare tra i file sg dobbiamo mettere due serie di parentesi: [] y [], essendo in questo modo: "S [] [] g"
- All'interno delle prime parentesi come ho detto sopra, andrà il testo che vogliamo rimuovere e sostituire con uno nuovo, mentre nella seconda serie di parentesi andrà il nuovo testo da inserire, seguendo l'esempio: "S [la mia famiglia] [noi] g"
Semplice no?
La spiegazione è in realtà molto più ampia di quanto necessario per il comando, è abbastanza semplice da capire 🙂
Perl è molto, molto di più di un semplice modo per sostituire il testo, è un intero linguaggio 😉
Se vuoi saperne di più, installa il pacchetto perl-doc e dai un'occhiata a whooodo cosa permette, è solo un universo diverso.
A proposito e per chiudere, supponendo che tu voglia trovare tutti i file .txt che hai in $ HOME / Documenti / e in ognuno sostituire "la mia famiglia" con "noi", puoi unirti a find + perl per ottenere questo:
find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;
O utilizzando un carattere jolly:
perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt
Il problema con questa seconda variante è che non verrà sostituita nei file che si trovano nelle sottocartelle
Comunque, spero che tu l'abbia trovato interessante. Per me è stato davvero utile, posso già sostituire il testo direttamente da terminale ... fantastico! 😀
Bene, penso che molti di noi qui conoscano il comando sed, che ha lo stesso scopo, lo rende molto migliore ed è più facile da usare ...
Grazie per il tuo commento,
Solo due dettagli, perché dici che sed lo rende migliore? È davvero più facile da usare con così tanti personaggi "strani"?
Grazie a tutti!!!. Ho usato il comando setee il metodo qui descritto con perl è più semplice. Grazie KZKG ^ Gaara !!!.
Grazie per il commento 🙂
Beh, almeno mi sembra che questo sia più semplice delle espressioni regolari ... che con così tanti personaggi "strani", qualcosa di veramente complesso da capire e da imparare può essere fatto ai non esperti.
C'è un «vecchio» adagio là fuori: «Ho avuto un problema, ho deciso di usare le espressioni regolari ... ora ho DUE problemi» 😉
HAHAHAHAHAHAHA !!!
Le espressioni regolari possono salvare le nostre vite a un certo punto ... sì, ci vuole molto tempo per imparare a usarle e non morire provandoci.
Se avessi conosciuto questo comando anni fa, DIO !! quanto sarebbe stata semplice la mia vita 😀
Chiaro! Ben gestiti sono molto potenti 🙂 Niente di meglio per manipolare il testo. Ma a volte, come dici in questo caso con Perl, non devi andare così lontano se una sostituzione è sufficiente.
Avrei comunque usato Python :)
Ma nella sete lo vedo ancora più semplice ... sto facendo qualcosa di sbagliato?
sed -i "sì / cosa-voglio-cambiare / nuovo-da-inserire /" file-in-che-sostituire
heh heh ... e se voglio sostituire "http://my.blog.com/content/" con "http://my.blog.com/uploads/files/" 😀 ... già lì devi mettere \ con spazi e altri e diventa complesso o no?
Non è obbligatorio utilizzare / come separatore. Guarda con +
sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» file
O_O ... WTF!
Mi hai aperto un intero universo di opzioni ora .. O_O
Adoro questi post in cui tutti impariamo qualcosa 🙂
Non lo sapevo nemmeno io.
Preferisco usare direttamente vi ..
Semplice come:
:% s / us / my family / g
% -> intero documento
s -> cerca
g -> tutte le occorrenze
Saluti ..
Grazie!
Non sapevo come farlo con vi
Aggiunto ai preferiti!
Grazie!
Dai un'occhiata se hai un po 'del comando rpl
http://microbuffer.wordpress.com/2011/02/28/rpl-buscar-y-reemplazar-strings-en-linux-unix/
Ottima voce! Nel caso qualcuno sia interessato, lo stesso con il comando sed di Linux: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
E cosa succede se all'interno del file quello che voglio sostituire ha delle virgolette?
Esempio sostituire il testo: »1 ″ con il testo:» 2 ″
come sarebbe il comando?
Ciao
Volevo sostituire una stringa che aveva un @ nel mezzo e ha cambiato solo il testo prima del segno.
testo da modificare: Lunga vita al Perù
nuovo testo: Viva mi patria @percysalgado
In figura: lunga vita alla mia patria
Grazie per l'aiuto
"\" Devi usare la barra prima dei caratteri con doppio uso @, #, in modo che vengano interpretati come testo.
E come lo faccio in Windows ????