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
sujeirasociedade 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
sujeirasociedade 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! 😀
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 ...
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'?
Saudações a todos!!!. Eu usei o comando sede, e o método descrito aqui com perl é mais simples. Obrigado KZKG ^ Gaara !!!.
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.
Existe um «velho» adágio por aí: «Tive um problema, decidi usar Expressões Regulares ... agora tenho DOIS problemas» 😉
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 😀
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 :)
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
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?
Não é obrigatório usar / como separador. Olhe com +
sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» arquivo
O_O… WTF!
Você abriu todo um universo de opções para mim agora .. O_O
Eu amo esses posts onde todos nós aprendemos alguma coisa 🙂
Eu também não sabia disso.
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 ..
Thanks!
Não sabia como fazer com o vi
Adicionado aos favoritos!
Thanks!
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/
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
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?
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
"\" Deve-se usar a barra antes dos caracteres com duplo uso @, #, para que sejam interpretados como texto.
E como faço no windows ????