Заменете текста във файловете само с една команда: 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 да изпълни» ^ - ^
  • След това в кавички » отваряме с a s и затваряме с a g: "sg" ... Представете си S за старт и G за Game Over 😀
  • Обърнете се между sg трябва да поставим два комплекта скоби: [] y [], бидейки такъв: "S [] [] g"
  • Вътре в първите скоби, както казах по-горе, ще отиде текстът, който искаме да премахнем и заменим с нов, докато във втория набор от скоби ще отиде новият текст, който трябва да поставим, следвайки примера: „S [моето семейство] [ние] g“

Просто, нали?

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

Perl е много, много повече от просто начин за заместване на текст, това е цял език 😉

Ако искате да научите повече за това, инсталирайте пакета perl-doc и погледнете whooodo какво позволява, това е просто различна вселена.

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

Проблемът с този втори вариант е, че той няма да замести във файлове, които са в подпапки

Както и да е, надявам се да ви е било интересно. За мен това беше наистина полезно, вече мога да заменя текст директно от терминала ... чудесно! 😀


Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

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

  1.   стрела каза той

    Е, мисля, че много от нас тук познават командата sed, която служи на същата цел, прави го много по-добре и е по-лесна за използване ...

    1.    KZKG ^ Гаара каза той

      Благодаря за вашия коментар,
      Само две подробности, защо казвате, че sed го прави по-добър? Наистина ли е по-лесно да се използва с толкова много „странни“ знаци?

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

    Поздрави на всички!!!. Използвал съм командата жажда, а методът, описан тук с perl, е по-прост. Благодаря KZKG ^ Гаара !!!.

    1.    KZKG ^ Гаара каза той

      Благодаря за коментара 🙂
      Е, поне ми се струва, че това е по-просто от регулярните изрази ... че с толкова много „странни“ знаци може да се направи нещо наистина сложно за разбиране и научаване на неразумните.

      1.    Гискард каза той

        Има "стара" поговорка там: "Имах проблем, реших да използвам регулярни изрази ... сега имам ДВА проблема" 😉

        1.    KZKG ^ Гаара каза той

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

          Ако бях познавал тази команда преди години, БОЖЕ !! колко прост би бил животът ми 😀

          1.    Гискард каза той

            Ясно! Добре обработени, те са много мощни 🙂 Нищо по-добро за манипулиране на текста. Но понякога, както казвате в този случай с Perl, не е нужно да стигате толкова далеч, ако замяната е достатъчна.
            Все пак щях да използвам Python :)

    2.    dhunter каза той

      Но в жаждата го виждам още по-просто ... правя ли нещо нередно?

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

      1.    KZKG ^ Гаара каза той

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

        1.    dhunter каза той

          Не е задължително да се използва / като разделител. Погледнете с +

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

          1.    KZKG ^ Гаара каза той

            O_O ... WTF!
            Вече отворихте цяла вселена от опции за мен .. O_O

          2.    Гискард каза той

            Обичам тези публикации, в които всички научаваме нещо 🙂
            Не знаех и това.

  3.   RAW-основен каза той

    Предпочитам да използвам директно vi ..

    Толкова просто като:
    :% s / us / моето семейство / g

    % -> целият документ
    s -> търсене
    g -> всички случаи

    Поздрави ..

    1.    KZKG ^ Гаара каза той

      Благодаря ви!
      Не знаех как да го направя с vi

  4.   st0rmt4il каза той

    Добавено към любими!

    Благодаря ви!

  5.   n3буря каза той

    Погледнете го, ако имате малко от командата rpl

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

  6.   DuranG каза той

    Страхотно влизане! В случай, че някой се интересува, същото е и с командата 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.   Габа каза той

    И как да го направя в прозорци ????