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

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

Бывает, что с регулярные выражения это может быть достигнуто, команда sed просто великолепна, у нее бесконечное количество вариантов и опций, но ... для тех, кто просто хочет заменить текст из наименее сложный способ, для них это то, что я привожу этот гораздо более простой вариант:

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

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

С помощью следующей команды вы измените «моя семья" по "нам«:

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

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

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

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

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

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

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

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


Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   заграждение сказал

    Что ж, я думаю, что многие из нас здесь знают команду sed, которая служит той же цели, она делает ее намного лучше и проще в использовании ...

    1.    КЗКГ ^ Гаара сказал

      Спасибо за ваш комментарий,
      Всего две детали, почему вы говорите, что sed делает его лучше? Неужели проще использовать такое количество «странных» персонажей?

  2.   Федерико А. Вальдес Тужаге сказал

    Привет всем!!!. Я использовал команду СЕПГ, а описанный здесь метод с Perl проще. Спасибо КЗКГ ^ Гаара !!!.

    1.    КЗКГ ^ Гаара сказал

      Спасибо за комментарий 🙂
      Ну, по крайней мере, мне кажется, что это проще, чем регулярные выражения ... что с таким количеством «странных» символов что-то действительно сложное для понимания и изучения может быть сделано неискушенным.

      1.    Жискар сказал

        Есть «старая» пословица: «У меня была проблема, я решил использовать регулярные выражения ... теперь у меня ДВЕ проблемы» 😉

        1.    КЗКГ ^ Гаара сказал

          ХАХАХАХАХАХА !!!
          Регулярные выражения могут спасти нам жизнь в определенный момент ... да, нужно много времени, чтобы научиться их использовать и не умереть, пытаясь.

          Если бы я знал эту команду много лет назад, БОГ !! насколько простой была бы моя жизнь 😀

          1.    Жискар сказал

            Очистить! При правильном обращении они очень мощные Нет ничего лучше для манипулирования текстом. Но иногда, как вы говорите в этом случае с Perl, вам не нужно заходить так далеко, если достаточно замены.
            Я бы все равно использовал Python :)

    2.    Данхантер сказал

      Но в жажде я вижу еще проще ... Я что-то не так делаю?

      sed -i "if / what-I-want-to-change / new-to-put /" file-in-which-to-replace

      1.    КЗКГ ^ Гаара сказал

        хе-хе ... и если я хочу заменить "http://my.blog.com/content/" на "http://my.blog.com/uploads/files/" 😀 ... у вас уже есть поставить \ с пробелами и прочее, а усложняется или нет?

        1.    Данхантер сказал

          Использование / в качестве разделителя не обязательно. Посмотрите с +

          sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» файл

          1.    КЗКГ ^ Гаара сказал

            О_О… Боже!
            Ты открыл мне сейчас целую вселенную возможностей .. О_О

          2.    Жискар сказал

            Мне нравятся эти посты, где мы все чему-то учимся 🙂
            Я этого тоже не знал.

  3.   RAW-Базовый сказал

    Я предпочитаю использовать непосредственно vi ..

    Так просто как:
    :% s / нас / моя семья / г

    % -> весь документ
    s -> поиск
    g -> все вхождения

    Приветствую ..

    1.    КЗКГ ^ Гаара сказал

      Спасибо!
      Я не знал, как это сделать с vi

  4.   st0rmt4il сказал

    Добавлено в избранное!

    Спасибо!

  5.   н3сторм сказал

    Взгляните на него, если у вас есть немного команды rpl

    http://microbuffer.wordpress.com/2011/02/28/rpl-buscar-y-reemplazar-strings-en-linux-unix/

  6.   ДюранГ сказал

    Отличная запись! Если кому-то интересно, то же самое с командой Linux sed: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Сомневаясь сказал

      А что будет, если в файле то, что я хочу заменить, содержит кавычки?
      Пример замены текста: »1 ″ на текст:» 2 ″
      как будет команда?

  7.   Перси сальгадо сказал

    Привет

    Я хотел заменить строку с символом @ посередине и изменил текст только на текст перед at.

    текст изменить: Да здравствует Перу
    новый текст: Viva mi patria @percysalgado
    Показано: Да здравствует моя родина

    Спасибо за вашу помощь

  8.   анонимный сказал

    "\" Вы должны использовать косую черту перед символами с двойным использованием @, #, чтобы они интерпретировались как текст.

  9.   Габа сказал

    А как в windows сделать ????