sed altera inadvertidamente as terminações da linha do Windows. Como posso evitar isso?

0

Estou desenvolvendo no linux um aplicativo portátil, no qual eu queria remover espaços à direita de alguns arquivos de origem, que possuem terminações de linha no estilo windows. Os finais de linha não devem ser alterados para unix.

O uso de código 'sed'- foi simples o suficiente para encontrar on-line:

sed -i.bak -E 's/[[:space:]]+$//' myfile

o problema é que, após a operação, diff declara que TODAS as linhas no arquivo (e o .bak que foi gerado) diferem. Isso não pode ser verdade, claro. O arquivo específico tinha apenas 1 linha com um espaço à direita.

Verificando com um utilitário hexdump (usei od -x myfile ) é aparente que a primeira linha do arquivo original termina em "0d0a", enquanto que no arquivo editado por sedina termina em "0a".

Não consegui encontrar nenhuma informação sobre como realizar a remoção de espaços à direita sem afetar os términos de linha. Existe um caminho?

se o caractere "Retorno de carro" fizer parte do grupo de regex "[[: espaço:]]", talvez isso

sed -i.bak -E 's/[ \t]+$//' myfile

deve funcionar. Mas isso não acontece - cria um arquivo idêntico. Eu também tentei a bandeira "-e" e até mesmo nenhuma bandeira. Ainda assim, o arquivo gerado é idêntico ao original e nenhum espaço final é removido.

    
por nass 19.10.2018 / 18:43

1 resposta

1

Sim, o caractere (\ r = ^ M = 0x0D) pertence à classe de caracteres space ". Permitir isso no segundo regex, com um caractere curinga:

sed -i.bak -E 's/[ \t]+.$/\r/' myfile

ou o caractere específico, como

sed -i.bak -E 's/[ \t]+\r$/\r/' myfile

Se o seu sed não reconhecer a notação \r , tente outro. como hex \x0D ou octal 5 .

    
por 19.10.2018 / 19:00