Procurar num ficheiro e alterar - Bash Shell

Iniciado por Angiak, 10 de Março de 2010, 16:25

tópico anterior - próximo tópico

Angiak

Boas a todos pessoal.
Não sei se ja existe resposta para isto mas não encontrei por isso aqui vai:

Estou a fazer um pequeno programa em bash shell e pouco ou nada percebo do assunto, neste momento gostaria que o programa ao ter num ficheiro de texto 2 linhas p.ex com:
->banana batatas couves
->coelho pato porco

Me fosse possivel identificar a linha correspondente por exemplo a palavra coelho e posteriormente alterar unica e exclusivamente essa palavra por uma outra.

Se alguem souber como se faz ou tenha link de algum tutorial que explique como fazer que diga por favor.
aceito qualquer ajuda

cumps e obrigado a todos
Angiak


"O mal do passado foi os homens tornarem-se escravos. O perigo do futuro é que eles se tornem robôs." Erich Fromm

Roberto Ramos

Para procurar a palavra vc pode usar o comando "grep", abaixo segue o link com um bom tutorial sobre o comando:
http://olinux.uol.com.br/artigos/304/1.html


Para substituir a palavra por uma outra vc pode usar o comando "sed" pegando a saida do comando "grep" com um "|"(pipe) e executando o sed, segue abaixo um link para um tutorial de sed que tem uns exemplos:
http://olinux.uol.com.br/artigos/314/1.html

Leia os dois tutoriais que são continuação um do outro que vc aprenderá o que vc quer fazer, aconselho a ler todas as aulas desse artigo pois ajudará bastante a vc fazer seus script's shell's.

[]'s e espero ter ajudado... ;)

clcampos

Criei um arquivo teste com  as duas linhas do seu exemplo como conteúdo, e ai alterei a palavra coelho para cachorro usando a linha abaixo:

Citarcat teste | grep coelho | sed  s/coelho/cachorro/g
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Angiak

#3
Muito obrigado aos 2.

Citação de: clcampos online 10 de Março de 2010, 16:40
Criei um arquivo teste com  as duas linhas do seu exemplo como conteúdo, e ai alterei a palavra coelho para cachorro usando a linha abaixo:

Citarcat teste | grep coelho | sed  s/coelho/cachorro/g
sim, realmente o  comando funciona, mas altera unicamente no terminal sendo que mantei o ficheiro original como estava, o que eu queria mesmo era que ele me permitisse alterar no ficheiro.
Como faço para isso acontecer

Edit:

Experimentei acrescentando ao comando anterior >>teste

no entanto, escrevemen uma nova linha
e não altera a anterior, ou seja fiquem com tres linhas

Cumps e obrigado
angiak
"O mal do passado foi os homens tornarem-se escravos. O perigo do futuro é que eles se tornem robôs." Erich Fromm

clcampos

#4
Pô dai é sua imaginação né.

Vamos lá:

Citar#!/bin/bash
#
nomeArq="teste"   #Arquivo a alterar

# Informação a ser pesquisada e substituida
echo "Informe o nome a pesquisar"
read nPesq

# Nova informação para se colocar no lugar
echo "Informe o novo termo"
read nNovo

#Pesquisa do termo e troca pelo novo
novaLinha=`cat $nomeArq | grep $nPesq | sed s/$nPesq/$nNovo/g`

#Eliminando a linha atual
cat $nomeArq | grep -v $nPesq > /tmp/$nomeArq

# Acrescentando a nova linha
echo $novaLinha >> /tmp/$nomeArq

# Substituindo o arquivo velho pelo novo
mv /tmp/$nomeArq   $nomeArq

Agora não me vá usar o código acima, primeiro porque não testei, apenas digitei direto no tópico, segundo porque ele não faz nenhuma conferência, terceiro pq imagino que apenas uma linha vá combinar com o termo especificado.

O código é apenas para te mostrar que pode ser feito, basta você ter imaginação e conhecer os comandos.

Boa sorte, e antes que me esqueça, devem ter muitas outras formas para se fazer isso.

[]'s

Cristiano

editando: Acertei o script porque errei ao referenciar umas variáveis.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

clcampos

Putz... acho que eu gosto demais de shell script... vamos a outra forma, mais simples.

Citar#!/bin/bash
#
nomeArq="teste"   #Arquivo a alterar

# Informação a ser pesquisada e substituida
echo "Informe o nome a pesquisar"
read nPesq

# Nova informação para se colocar no lugar
echo "Informe o novo termo"
read nNovo

#Pesquisa do termo e troca pelo novo
sed s/$nPesq/$nNovo/g` $nomeArq > /tmp/$nomeArq

# Substituindo o arquivo velho pelo novo
mv /tmp/$nomeArq   $nomeArq

De novo não vá usar o código acima, porque não testei, apenas digitei direto no tópico, segundo porque ele não faz nenhuma conferência, terceiro pq neste caso ele troca todas as ocorrências do termo pesquisado pelo novo termo,  só que ao menos mantem a ordem das linhas.

[]'s

Cristiano
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Angiak

muito obrigado CLcampos ja percebi a ideia, muito obrigado pela explicação e ajuda

Cumps
Angiak
"O mal do passado foi os homens tornarem-se escravos. O perigo do futuro é que eles se tornem robôs." Erich Fromm