Comando Sed perde a última linha [RESOLVIDO]

1. Comando Sed perde a última linha [RESOLVIDO]

Dalton Augusto Soares
DaltonSoares

(usa Ubuntu)

Enviado em 12/03/2017 - 23:30h

Estou executando o comando sed porém quando gero o novo arquivo ele sempre perde a ÚLTIMA linha.
Alguém pode me ajudar?

O arquivo vasportal_applications.xml original termina com
"
</application>
</applications>
<portal-menus />
</config>
"

Já o arquivo vasportal_applications.xml depois do Sed termina com:
"
</application>
</applications>
<portal-menus />

"

Abaixo segue meu script.
#!/bin/bash

DATA=`date +%Y%m%d%H%M%S`
export DATA
cp -p vasportal_applications.xml vasportal_applications.xml.old_$DATA
cp -p vasportal_applications.xml arquivo-tmp.xml

#varVerificaApontamento=`cat vasportal_applications.xml | grep soasuitefqa:10020 | wc -l`
varValorAntigo=$1
varValorNovo=$2

if [ -z $varValorAntigo ] || [ -z $varValorNovo ]; then
echo "Necessário colocar o valor antigo e o valor novo"
echo "Exemplo"
echo "Apontamento 10020 20020"
exit 1
fi

sed "s/$varValorAntigo/$varValorNovo/g" arquivo-tmp.xml >> vasportal_applications.xml
#rm texto-tmp.txt


A última linha está indo em branco.
Eu até poderia verificar se a última linha está em branco e caso estiver adicionar </config> mas gostaria de entender o que pode estar acontecendo.

Muito obrigado pela ajuda de todos.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/03/2017 - 15:30h

Quando eu enviei a resposta anterior, estava no celular.

Agora, no micro, fiz vários testes com o sed, em diferentes sistemas (Linux e AIX) e não consegui reproduzir o problema com tratamento de uma última linha na qual eventualmente falte a marca de fim de linha. Esse “problema” existe com alguns utilitários (como o wc e o gcc), mas aparentemente não com o sed (ao menos não com uma substituição simples, como a que você mostrou).

Não sei o que está acontecendo no seu caso. De todo modo, eu tentaria trocar o sed por perl, para ver o que acontece, ou trocando a linha
sed "s/$varValorAntigo/$varValorNovo/g" arquivo-tmp.xml >> vasportal_applications.xml 

por
perl -pe "s/$varValorAntigo/$varValorNovo/g;" arquivo-tmp.xml >> vasportal_applications.xml 

ou reescrevendo todo o script em Perl, como mostrado abaixo.

#!/usr/bin/perl

use POSIX;

$origfile="vasportal_applications.xml";\

$date=strftime("%Y%m%d%H%M%S", localtime(time()));
$backupfile="$origfile.old_$date";
$tempfile="arquivo-tmp.xml";

system("cp", "-p", $origfile, $backupfile);
system("cp", "-p", $progfile, $tempfile);

#if(open(ORIG, "<", $origfile){ while(<ORIG>){ if(/soasuitefqa:10020/){ $verificaApontamento++; } } close(ORIG);
if($#ARGV<1 || ($valorAntigo=$ARGV[0]) eq "" || ($valorNovo=$ARGV[1]) eq ""){
print STDERR <<EndOfMessage;
Necessário colocar o valor antigo e o valor novo.
Exemplo:
$0 10020 20020
EndOfMessage
exit(1);
}

die("Não foi possível abrir arquivo temporário: $!.\n") unless open(TEMP, "<", $tempfile);
die("Não foi possível abrir arquivo a ser alterado: $!.\n") unless open(ORIG, ">>", $origfile);
while(<TEMP>){
sed s/$valorAntigo/$valorNovo/g;
die("Não foi possível escrever no arquivo: $!.\n"; unless print ORIG $_;
}
close(ORIG);
close(TEMP);

#unlink($tempfile);


NOTA: Tem certeza de que você realmente quer ACRESCENTAR o conteúdo modificado ao final do arquivo original? Faria mais sentido, em geral, SUBSTITUIR o conteúdo original pelo modificado. Mas eu não alterei esse comportamento, que já estava no seu script original.

3. Re: Comando Sed perde a última linha [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/03/2017 - 08:30h

Examine o arquivo original, antes de passar pelo sed, e veja se ele termina realmente com uma sinalização de fim de linha após a última tag do XML.

Um jeito de ver isso é rodar hexdump -C nome_do_arquivo, e observar se o último byte de dados tem o valor 0A. Se não tiver, você pode ter de providenciar a inclusão dessa marca, a fim de satisfazer ferramentas do UNIX que só entendem como “linhas” aquelas que possuem o terminador de linha.


4. Comando não encontrado

Dalton Augusto Soares
DaltonSoares

(usa Ubuntu)

Enviado em 13/03/2017 - 09:40h

paulo1205 o comando me aparece como não encontrado.


portalqa@snesun524 ~/VAS_Portal_R1.1_P008_V1/server/vasportal/conf> hexdump -C vasportal_applications.xml
-bash: hexdump: command not found

Não tenho acesso como admin para instalar o pacote.

Tem alguma outra sugestão?


5. Obrigado paulo1205 funcionou.

Dalton Augusto Soares
DaltonSoares

(usa Ubuntu)

Enviado em 13/03/2017 - 16:09h

Paulo usando por perl funcionou!

Muito obrigado pela ajuda.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts