Substitua o texto dentro dos arquivos com apenas um comando: perl

Em certas ocasiões, queremos substituir o texto dentro de um arquivo, por exemplo, mudar em Document.txt tudo o que "minha família" diz sobre "nós". Para conseguir isso, podemos usar nosso editor de texto preferido (Kate, Gedit, SublimeText, etc), mas é sempre bom saber variantes, outras maneiras de obter o mesmo resultado 🙂

Acontece que com expressões regulares isso pode ser feito, o comando sed é simplesmente magnífico, tem infinitas variantes e opções, mas ... para aqueles que querem apenas substituir o texto do maneira menos complexa possível, para eles é que trago esta variante muito mais simples:

Seguindo o exemplo, temos o arquivo Document.txt localizado em $ HOME / Document.txt com o seguinte texto:

(...) minha família é como todos eles, como o seu ou o do seu vizinho. De fato minha família Procuramos ser pessoas responsáveis ​​e aos olhos da sociedade, politicamente e socialmente corretos. Porém, na minha casa existe uma ovelha negra, e esse é o meu papel LOL! Eu sempre fui aquele que não tem medo de dizer o que pensa (mesmo que não seja aparentemente correto aos olhos da sociedade), embora na realidade minha família esteja farta do sujeira sociedade atual.

Com o seguinte comando você mudará «minha família" de "nos":

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

É simples assim 🙂

Então, o texto seria:

(...) nos é como todos eles, como o seu ou o do seu vizinho. De fato nos Procuramos ser pessoas responsáveis ​​e aos olhos da sociedade, politicamente e socialmente corretos. Porém, na minha casa existe uma ovelha negra, e esse é o meu papel LOL! Eu sempre fui aquele que não tem medo de dizer o que pensa (mesmo que não seja aparentemente correto aos olhos da sociedade), embora na realidade minha família esteja farta do sujeira sociedade atual.

A sintaxe é:

perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar

O comando pode parecer um pouco complexo, vamos decompô-lo um pouco e explicá-lo de forma mais simples 😉

  • perl : O que vamos usar, perl
  • -pi : Pi, como π (o valor aproximado de 3.14)
  • -e : OE imagine para «e executar» ^ - ^
  • Então entre aspas » nós abrimos com um s e fechamos com um g: "sg" … Imagine S para Iniciar e G para Fim de Jogo 😀
  • Vire entre o sg devemos colocar dois conjuntos de colchetes: [] y [], sendo assim: "S [] [] g"
  • Dentro dos primeiros colchetes, como eu disse acima, o texto que queremos remover e substituir por um novo irá, enquanto no segundo conjunto de colchetes irá o novo texto a ser colocado, seguindo o exemplo: "S [minha família] [nós] g"

Simples, não é?

A explicação é na verdade muito mais extensa do que o necessário para o comando, é bastante simples de entender 🙂

Perl é muito, muito mais do que uma forma de substituir texto, é uma linguagem completa 😉

Se você quiser saber mais sobre isso, instale o pacote perl-doc e dê uma olhada no que isso permite, é apenas um universo diferente.

A propósito e para fechar, supondo que você deseja encontrar todos os arquivos .txt que você tem em $ HOME / Documents / e em cada um substituir "minha família" por "nós", você pode entrar no find + perl para conseguir isso:

find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;

Ou usando um curinga:

perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt

O problema com esta segunda variante é que ela não substitui em arquivos que estão em subpastas 🙂

De qualquer forma, espero que você tenha achado interessante. Para mim tem sido muito útil, já posso substituir o texto diretamente do terminal ... ótimo! 😀


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   estrondo dito

    Bom, acho que muitos de nós aqui conhecemos o comando sed, que tem o mesmo propósito, torna-o muito melhor e é mais fácil de usar ...

    1.    KZKG ^ Gaara dito

      Obrigado pelo seu comentário,
      Apenas dois detalhes, por que você diz que o sed o torna melhor? É realmente mais fácil de usar com tantos personagens 'estranhos'?

  2.   Federico A. Valdés Toujague dito

    Saudações a todos!!!. Eu usei o comando sede, e o método descrito aqui com perl é mais simples. Obrigado KZKG ^ Gaara !!!.

    1.    KZKG ^ Gaara dito

      Obrigado pelo comentário 🙂
      Bem, pelo menos me parece que isso é mais simples do que expressões regulares ... que com tantos caracteres 'estranhos', algo realmente complexo de entender e aprender pode ser feito para os não-experientes.

      1.    moela dito

        Existe um «velho» adágio por aí: «Tive um problema, decidi usar Expressões Regulares ... agora tenho DOIS problemas» 😉

        1.    KZKG ^ Gaara dito

          HAHAHAHAHAHAHA !!!
          As expressões regulares podem salvar nossas vidas em um determinado momento ... sim, leva muito tempo para aprender a usá-las e não morrer tentando.

          Se eu soubesse desse comando anos atrás, DEUS !! quão simples minha vida teria sido 😀

          1.    moela dito

            Claro! Bem manuseados, são muito poderosos 🙂 Nada melhor do que manipular texto. Mas às vezes, como você diz neste caso com Perl, você não precisa ir tão longe se uma substituição for suficiente.
            Eu teria usado Python de qualquer maneira :)

    2.    caçador dito

      Mas na sede, vejo que é ainda mais simples ... estou fazendo algo errado?

      sed -i "sim / o-que-quero-mudar / novo-colocar /" arquivo-no-que-substituir

      1.    KZKG ^ Gaara dito

        heh heh ... e se eu quiser substituir "http://my.blog.com/content/" por "http://my.blog.com/uploads/files/" 😀 ... já aí você tem colocar \ com espaços e outros, e fica complexo ou não?

        1.    caçador dito

          Não é obrigatório usar / como separador. Olhe com +

          sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» arquivo

          1.    KZKG ^ Gaara dito

            O_O… WTF!
            Você abriu todo um universo de opções para mim agora .. O_O

          2.    moela dito

            Eu amo esses posts onde todos nós aprendemos alguma coisa 🙂
            Eu também não sabia disso.

  3.   RAW-Básico dito

    Prefiro usar diretamente vi ..

    Tão simples quanto:
    :% s / us / minha família / g

    % -> documento inteiro
    s -> pesquisar
    g -> todas as ocorrências

    Saudações ..

    1.    KZKG ^ Gaara dito

      Thanks!
      Não sabia como fazer com o vi

  4.   st0rmt4il dito

    Adicionado aos favoritos!

    Thanks!

  5.   n3 tempestade dito

    Dê uma olhada nele se você tiver um pouco do comando rpl

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

  6.   DuranG dito

    Excelente entrada! Caso alguém esteja interessado, o mesmo com o comando sed do Linux: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

    1.    Duvidando dito

      E o que acontece se dentro do arquivo o que desejo substituir tiver aspas?
      Exemplo de substituição do texto: »1 ″ pelo texto:» 2 ″
      como seria o comando?

  7.   Percy Salgado dito

    Olá

    Eu queria substituir uma string que tinha um @ no meio e apenas alterei o texto para antes de at.

    texto para alterar: Viva el Perú
    novo texto: Viva mi patria @percysalgado
    Mostrado: Viva minha terra natal

    Obrigado pela vossa ajuda

  8.   anônimo dito

    "\" Deve-se usar a barra antes dos caracteres com duplo uso @, #, para que sejam interpretados como texto.

  9.   Gaba dito

    E como faço no windows ????