Como adicionar um retorno de carro antes de cada nova linha?

21

Eu tenho um arquivo que usa apenas \n para novas linhas, mas eu preciso que ele tenha \r\n para cada nova linha. Como posso fazer isso?

Por exemplo, resolvi-o no Vim usando :%s/\n/\r\n/g , mas gostaria de usar um script ou aplicativo de linha de comando. Alguma sugestão?

Eu tentei procurar isso com sed ou grep , mas fiquei imediatamente confuso com as soluções alternativas da seqüência de escape (estou um pouco verde com esses comandos).

Se estiver interessado, o aplicativo está relacionado à minha pergunta / resposta aqui

    
por modulitos 01.09.2014 / 08:17

6 respostas

28

Você pode usar unix2dos (encontrado no Debian):

unix2dos file

Observe que essa implementação não insere um CR antes de cada LF , apenas antes dos LF s que ainda não foram precedidos por um (e somente um) CR e pularão arquivos binários (aqueles que contêm valores de bytes no intervalo 0x0 - > 0x1f diferente de LF , FF , TAB ou CR ).

ou use sed :

CR=$(printf '\r')
sed "s/\$/$CR/" file

ou use awk :

awk '{printf "%s\r\n", $0}' file

ou use perl :

perl -pe 's|\n|\r\n|' file
    
por 01.09.2014 / 08:36
6

Isso é exatamente o que unix2dos faz:

$ unix2dos file.txt

Isso substituirá file.txt no local por uma versão com finais de linha CRLF.

Se você quiser fazer isso com sed , você pode inserir um retorno de carro no final de cada linha:

sed -e 's/$/\r/' file.txt

Isso substitui ( s ) o tamanho zero área logo antes do final da linha ( $ ) com \r . Para fazer a substituição no local (como unix2dos ), use sed -i.bak , embora essa seja uma extensão não padrão - se você não tiver, use um arquivo temporário.

    
por 01.09.2014 / 08:36
2

Se você estiver fazendo a conversão em uma máquina Unix (OS X, Linux), abra o arquivo com vi ou vim :

$ vim my-file

pressione a tecla ESC para garantir que você não está no modo de inserção e digite

:set ff=dos

ou

:set fileformat=dos

Isso faz a conversão no local, definindo o formato do arquivo.

Para escrever o arquivo e sair do editor use

:wq

Na linha de comando você pode fazer

$ vi +':w ++ff=dos' +':q' my-file
    
por 11.01.2017 / 10:19
1

Uma função de shell portátil que fará isso:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

Com isso, você pode fazer:

u2dos file >dosfile
    
por 05.09.2014 / 05:18
1

No awk você pode tentar

awk '{print $0 "\r"}'

Ou

awk -v r=$'\r' '{print $0 r}'

O $'\r' é um exemplo de estilo ANSI-C, com suporte de alguns shells como ksh93 , bash , zsh , mksh e FreeBSD sh e provavelmente será incluído na edição 8 da Especificação Unix Única .

Ele oferece uma maneira geral de expressar caracteres estranhos, tente isso, por exemplo:

awk -v r=$'\U0001F608' '{print $0 r}'
    
por 05.09.2014 / 04:18
1

Fazer isso com o POSIX é complicado:

Para remover retornos de carro:

awk 'BEGIN{RS="";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

Para adicionar retornos de carro:

awk 'BEGIN{RS="";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
    
por 18.07.2016 / 03:41