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

28

Eu tenho um arquivo que só usa \npara novas linhas, mas preciso que ele tenha \r\npara cada nova linha. Como posso fazer isso?

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

Tentei pesquisar isso com sedor grep, mas fiquei imediatamente confuso com as soluções alternativas da sequência de escape (estou um pouco verde com esses comandos).

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

modulitos
fonte

Respostas:

36

Você pode usar o unix2dos (encontrado no Debian):

unix2dos file

Observe que esta implementação não inserirá um CRantes de cada LF, apenas antes daqueles LFque ainda não foram precedidos por um (e apenas um) CRe ignorará os arquivos binários (aqueles que contêm valores de bytes no intervalo 0x0 -> 0x1f LF, exceto FF, TABou 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
cuonglm
fonte
Observe que o unix2dox não inserirá um CRantes de cada LF, apenas antes daqueles LFs que ainda não foram precedidos por um (e apenas um) CR.
Stéphane Chazelas
@ StéphaneChazelas: Obrigado pelo ponto, acrescentou à minha resposta.
cuonglm
1
A principal informação para mim aqui estava usando '\r'com sedfaz o truque.
rkersh
8

É exatamente unix2dosisso que faz:

$ unix2dos file.txt

Isso substituirá file.txtno local por uma versão com terminações de linha CRLF.

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

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

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

Michael Homer
fonte
3
O uso \rem substituição não é portátil. Pelo menos, não funcionará no Mac OSX.
cuonglm
Observe que existem várias implementações do unix2dos. Você pode querer fornecer um link para a página inicial de uma implementação específica (como waterlan.home.xs4all.nl/dos2unix.html como encontrado no Debian) em vez de linux.die.net/man, que não deixa claro qual implementação (ou versão) está documentada. Note que existem alguns u2d, ux2dos, todosordena ao redor também.
Stéphane Chazelas
2

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

$ vim my-file

pressione a tecla ESC para garantir que você não esteja 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
Peter Evans
fonte
obrigado por explicar todas as etapas - para um novato, é muito mais fácil entender o que está acontecendo.
precisa saber é o seguinte
2

Fazer isso com o POSIX é complicado:

  • O POSIX Sed não suporta \rou \15. Mesmo se tiver, a opção no local -inão é POSIX

  • O POSIX Awk suporta \re \15, no entanto, a -i inplaceopção não é POSIX

  • O d2u e o dos2unix não são utilitários POSIX , mas ex é

  • POSIX ex não suporta \r, \15, \nou\12

Para remover retornos de carro:

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

Para adicionar retornos de carro:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
Steven Penny
fonte
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
mikeserv
fonte
1

No awk você pode tentar

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

Ou

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

A $'\r'é um exemplo de estilo ANSI-C citar como suportado por alguns como conchas ksh93, bash, zsh, mkshe o FreeBSD sh e susceptível de ser incluído em questão 8 do Unix Especificação único .

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

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