Понякога искаме да заменим текст във файл, например, като променим всичко, което казва „моето семейство“ на „нас“ в Document.txt . За да направим това, можем да използваме предпочитания от нас текстов редактор (Kate, Gedit, Sublime Text и др.), но винаги е добре да знаем алтернативи, други начини за постигане на същия резултат.
Оказва се, че с регулярни изрази това може да се постигне; командата `sed` е просто великолепна, има безкрайни вариации и опции, но... за тези, които искат само да заменят текст по възможно най-лесния начин , ви представям този много по-опростен вариант:
Следвайки примера, имаме файла Document.txt , разположен в $HOME/Document.txt , със следния текст:
Моето семейство е като всички останали, като твоето или на съседа ти. Всъщност, семейството ми се опитва да бъде отговорно в очите на обществото, политически и социално коректно. В къщата ми обаче има черна овца и това е моята роля, ха-ха! Винаги съм бил този, който не се страхува да каже какво мисля (дори и да не е социално приемливо), въпреки че в действителност семейството ми е писнало от
обърканотообщество на днешния ден.
Следната команда ще промени „ моето семейство “ на „ нас “:
perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt
Толкова е просто
Така че текстът ще бъде:
(...) ние сме като всички останали, като вашите или на съседа ви. Всъщност се опитваме да бъдем отговорни хора в очите на обществото, политически и социално коректни. В моята къща обаче има черна овца и това е моята роля, LOL! Винаги съм бил този, който не се страхува да каже какво мисля (дори и да не изглежда правилно в очите на обществото), въпреки че всъщност семейството ми е писнало от мръсотията
наднешното общество.
Синтаксисът е:
perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar
Командата може да изглежда малко сложна, нека я разбием малко и я обясним малко по-просто
- Perl : Какво ще използваме, perl
- -пи : Пи, как π (приблизителната стойност на 3.14)
- -e : E си го представя за «e да изпълни» ^ - ^
- След това в кавички » отваряме с a s и затваряме с a g: "sg" …представете си S за начало и G за Game Over
- Обърнете се между sg трябва да поставим два комплекта скоби: [] y [], бидейки такъв: "S [] [] g"
- Вътре в първите скоби, както казах по-горе, ще отиде текстът, който искаме да премахнем и заменим с нов, докато във втория набор от скоби ще отиде новият текст, който трябва да поставим, следвайки примера: „S [моето семейство] [ние] g“
Просто, нали?
Обяснението всъщност е много по-дълго от това, което е необходимо за командата, то е доста лесно за разбиране
Perl е много, много повече от начин за заместване на текст, той е цял език
Ако искате да научите повече за това, инсталирайте пакета perl-doc и разгледайте всичко, което той позволява; това е просто различна вселена.
Между другото и за затваряне, ако приемем, че искате да намерите всички .txt файлове, които имате в $ HOME / Documents / и във всеки един да замените "my family" с "us", можете да се присъедините към find + perl, за да постигнете това:
find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;
Или с помощта на заместващ знак:
perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt
Проблемът с този втори вариант е, че той няма да замени файлове, които са в подпапки
Както и да е, надявам се да ви е било интересно. За мен това беше наистина полезно, вече мога да заменя текст директно от терминала... страхотно!