Заменить текст внутри файлов всего одной командой: perl

Иногда нам нужно заменить текст в файле, например, заменить все слова «моя семья» на «мы» в файле Document.txt . Для этого можно использовать предпочитаемый текстовый редактор (Kate, Gedit, Sublime Text и т. д.), но всегда полезно знать альтернативы, другие способы достижения того же результата.

Оказывается, этого можно добиться с помощью регулярных выражений ; команда `sed` просто великолепна, у неё бесконечное множество вариаций и опций, но… для тех, кто хочет заменить текст самым простым способом , я предлагаю гораздо более простой вариант:

Следуя примеру, у нас есть файл Document.txt , расположенный в каталоге $HOME/Document.txt , содержащий следующий текст:

Моя семья ничем не отличается от семей всех остальных, как ваша или ваша соседская. На самом деле, моя семья старается быть ответственными людьми в глазах общества, политкорректными и социально корректными. Однако в моем доме есть паршивая овца, и это моя роль, ха-ха! Я всегда была той, кто не боится говорить то, что думает (даже если это не принято в обществе), хотя на самом деле моя семья устала от того, что происходит в современном обществе.

Следующая команда заменит " my family " на " us ":

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

Это так просто 

Итак, текст будет:

(...) мы такие же, как и все остальные, как ваши или ваши соседи. На самом деле, мы стараемся быть ответственными людьми в глазах общества, политкорректными и социально корректными. Однако в моем доме есть паршивая овца, и это моя роль, ха-ха! Я всегда была той, кто не боится говорить то, что думаю (даже если это кажется неправильным в глазах общества), хотя на самом деле моя семья устала от грязи современного общества.

Синтаксис:

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 to execute» ^ - ^
  • Тогда в кавычках » мы открываем с s и мы заканчиваем g: "sg" …представьте себе букву «S» — «Начало» и букву «G» — «Игра окончена» 
  • Поверните между sg мы должны поставить два набора скобок: [] y [], будучи таким: "S [] [] g"
  • В первых скобках, как я сказал выше, будет текст, который мы хотим удалить и заменить новым, а во втором наборе скобок будет помещен новый текст, как показано в примере: "С [моя семья] [мы] г"

Просто не правда ли?

Объяснение на самом деле гораздо длиннее, чем необходимо для команды, понять его довольно просто 

Perl — это гораздо больше, чем просто способ замены текста, это целый язык 

Если вы хотите узнать об этом больше, установите пакет perl-doc и ознакомьтесь со всеми его возможностями; это просто совершенно другой мир.

Между прочим, и в заключение, предполагая, что вы хотите найти все файлы .txt, которые есть в $ HOME / Documents /, и в каждом из них заменить «моя семья» на «нас», вы можете присоединиться к 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

Проблема второго варианта в том, что он не заменяет файлы, находящиеся в подпапках 

В любом случае, я надеюсь, что вам было интересно. Для меня это было очень полезно, теперь я могу заменять текст прямо из терминала... отлично! 


Добавить в качестве предпочтительного источника в Google