Substituir palavra por linha

1. Substituir palavra por linha

Renato Rossi Ferreira
bilbobolseiro

(usa Ubuntu)

Enviado em 16/12/2018 - 12:00h

Bom dia, Senhores.

Eu to desenvolvendo uma rotina para fazer backup de arquivos de um diretório para outro através de uma lista dinâmica.

Exemplo de lista:
Relatorio Nagios,Monitoração,AFAZER
Relatorio Gastos,Fiscal,FEITO
Relatorio De Acesso,Monitoração,FEITO
Relatorio de despesas,Fiscal, AFAZER

Dessa lista eu gero uma variavel que contenha só "AFAZER" utilizando um grep e a lista gerada anteriormente.

LISTA=`grep "AFAZER" Lista_Dinamica`

depois eu utilizo um for para ir de linha a linha para fazer a atividade de copiar o arquivo ao diretório destino

for ITEM in ${LISTA}
do

NEW_ITEM=`echo ${ITEM} | sed 's/AFAZER/FEITO'` Lista dinamica

done

Porem quando uso o comando echo eu visualizo a modificação do AFAZER pra FEiTO e quando jogo a instrução acima para o arquivo da lista não acontece nada.

Eu tenho que diariamente entrar nessa lista de arquivos e encontrar a referencia "AFAZER" e fazer o backup desse arquivo e depois criar no mesmo arquivo e na mesma linha a atualização pra FEITO. Eu não sei porque o sed não está fazer isso. sendo que sed 's/a/b'..' faz a substituição da string. A Real que essa lista sempre irá crescer e eu não poderei fazer a limpeza da mesma e dessa forma tenho que encontrar a solução através desse parâmetro.

Alguem pode ajudar na ideia de atualizar o arquivo usando a linha atual do for?

Desde ja agradeço.


  


2. Re: Substituir palavra por linha

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 16/12/2018 - 13:05h

.
.
.
.
campeão ... deve ser a ressaca, mas eu não consegui entender o que vc quer fazer !!!

------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



3. Re: Substituir palavra por linha

Renato Rossi Ferreira
bilbobolseiro

(usa Ubuntu)

Enviado em 16/12/2018 - 13:19h

ARQUIVO "RELATORIO"
PATH/NOME;MD5;CLIENTE;STATUS
/home/server/Documents/doc/RV_000001.txt;d41d8cd98f00b204e9800998ecf8427e;RENNER;AFAZER
/home/server/Documents/doc/RO_000001.txt;b7269fa2508548e4032c455818f1e321;RENNER;AFAZER
/home/server/Documents/doc/RV_123432.txt;87fb6575afefb1e07093092e03144940;RENNER;FEITO
/home/server/Documents/doc/RO_342129.txt;af96b33f0b201b70244431caa2fd03a2;RENNER;AFAZER
/home/server/Documents/doc/RC_111111.txt;403ee4b72cc601353042064cd516ed60;RENNER;FEITO


LISTA=`grep "AFAZER" ${RELATORIO}`

for ITEM in ${LISTA}
do
...
cp -p ${DIRNAME}/${BASENAME} ${DIRNAME}/backup

if [[ ${?} != "0" ]]; then

echo "FALHA"

else
ITEM_NEW=`echo "${ITEM}" | sed 's/AFAZER/FEITO/'` ${RELATORIO}

fi

done
....
O resultado seria:

ARQUIVO "RELATORIO"
PATH/NOME;MD5;CLIENTE;STATUS
/home/server/Documents/doc/RV_000001.txt;d41d8cd98f00b204e9800998ecf8427e;RENNER;FEITO
/home/server/Documents/doc/RO_000001.txt;b7269fa2508548e4032c455818f1e321;RENNER;FEITO
/home/server/Documents/doc/RV_123432.txt;87fb6575afefb1e07093092e03144940;RENNER;FEITO
/home/server/Documents/doc/RO_342129.txt;af96b33f0b201b70244431caa2fd03a2;RENNER;FEITO
/home/server/Documents/doc/RC_111111.txt;403ee4b72cc601353042064cd516ed60;RENNER;FEITO

Tenho que deixar o status como feito para cada arquivo novo adicionado nessa lista.

Acho que agora passei a ideia mais clara.

rs... valeu mesmo.




4. Re: Substituir palavra por linha

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 16/12/2018 - 19:33h

Para efetuar mudanças no arquivo é necessário usar o parâmetro "-i" do sed:
sed -i 's/procura/substitui/' arquivo 

Sem o -i ele só mostra como seria a mudança!


5. Re: Substituir palavra por linha

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/12/2018 - 17:54h


bilbobolseiro escreveu:

ARQUIVO "RELATORIO"
PATH/NOME;MD5;CLIENTE;STATUS
/home/server/Documents/doc/RV_000001.txt;d41d8cd98f00b204e9800998ecf8427e;RENNER;AFAZER
/home/server/Documents/doc/RO_000001.txt;b7269fa2508548e4032c455818f1e321;RENNER;AFAZER
/home/server/Documents/doc/RV_123432.txt;87fb6575afefb1e07093092e03144940;RENNER;FEITO
/home/server/Documents/doc/RO_342129.txt;af96b33f0b201b70244431caa2fd03a2;RENNER;AFAZER
/home/server/Documents/doc/RC_111111.txt;403ee4b72cc601353042064cd516ed60;RENNER;FEITO


LISTA=`grep "AFAZER" ${RELATORIO}`

for ITEM in ${LISTA}
do
...
cp -p ${DIRNAME}/${BASENAME} ${DIRNAME}/backup

if [[ ${?} != "0" ]]; then

echo "FALHA"

else
ITEM_NEW=`echo "${ITEM}" | sed 's/AFAZER/FEITO/'` ${RELATORIO}'

fi

done
....
O resultado seria:

ARQUIVO "RELATORIO"
PATH/NOME;MD5;CLIENTE;STATUS
/home/server/Documents/doc/RV_000001.txt;d41d8cd98f00b204e9800998ecf8427e;RENNER;FEITO
/home/server/Documents/doc/RO_000001.txt;b7269fa2508548e4032c455818f1e321;RENNER;FEITO
/home/server/Documents/doc/RV_123432.txt;87fb6575afefb1e07093092e03144940;RENNER;FEITO
/home/server/Documents/doc/RO_342129.txt;af96b33f0b201b70244431caa2fd03a2;RENNER;FEITO
/home/server/Documents/doc/RC_111111.txt;403ee4b72cc601353042064cd516ed60;RENNER;FEITO

Tenho que deixar o status como feito para cada arquivo novo adicionado nessa lista.

Acho que agora passei a ideia mais clara.

rs... valeu mesmo.


Boa tarde Bilbo.
Segue sugestão:
nl=1;while read line;do
read -a fld <<< $(sed 's/\;/ /g' <<< $line);
if [[ ${fld[3]} = "AFAZER" ]];then
if cp ${fld[0]})$(dirname ${fld[0]})/BKP";then
sed -i "${nl}s/AFAZER/FEITO/" relatorio.txt
fi
fi
let nl++;
done<relatorio.txt

OBS.:
O seu comando:
echo "${ITEM}" | sed 's/AFAZER/FEITO/'` ${RELATORIO}'
troca todos AFAZER por FEITO independente da "linha"/ITEM em questão
O comando :
sed -i "${nl}s/AFAZER/FEITO/" relatorio.txt 

Altera somente a linha em questão, que é a var "${nl}"

marcelo oliver






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts