Convertendo a formatação de nova linha do Mac para o Windows


133

Preciso de um utilitário / script de conversão que converta um arquivo .sql dump gerado no Mac para um legível no Windows. Esta é a continuação de um problema que tive aqui . O problema parece estar com a formatação de nova linha em arquivos de texto, mas não consigo encontrar uma ferramenta para fazer a conversão ...


3
A ferramenta genérica que fiz depois de não encontrar qualquer solução satisfatória com força industrial github.com/mdolidon/endlines
Mathias Dolidon

Respostas:


134

O Windows usa carriage return+ line feedpara nova linha:

\r\n

O Unix usa apenas Line feedpara nova linha:

\n

Em conclusão, basta substituir todas as ocorrências de \npor \r\n.
Ambos unix2dose dos2unixnão estão disponíveis por padrão no Mac OSX.
Felizmente, você pode simplesmente usar Perlou sedfazer o trabalho:

sed -e 's/$/\r/' inputfile > outputfile                # UNIX to DOS  (adding CRs)
sed -e 's/\r$//' inputfile > outputfile                # DOS  to UNIX (removing CRs)
perl -pe 's/\r\n|\n|\r/\r\n/g' inputfile > outputfile  # Convert to DOS
perl -pe 's/\r\n|\n|\r/\n/g'   inputfile > outputfile  # Convert to UNIX
perl -pe 's/\r\n|\n|\r/\r/g'   inputfile > outputfile  # Convert to old Mac

Fragmento de código de:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities


36
O sedcomando do UNIX para o DOS não funciona para mim no OS X Lion - apenas insere o texto "r" no final de cada linha. O perlcomando funciona embora.
Ergwun

7
OSX usa a versão mais antiga do sed. Eu uso o Homebrew for OSX e instalei o gnu-sed. Você usa com o comando "gsed" em vez de "sed". Isso funciona.
John

2
Use o Homebrew para obter os pacotes dos2unix e unix2dos.
Pratyush

10
O OS X Yosemite ainda tem o mesmo problema sed, mas você pode contorná-lo sem instalar o Homebrew, gnu-sed ou unix2dos: Use sed -e 's/$/^M/' inputfile > outputfile, onde ^Mé um caractere de controle produzido na linha de comando Ctrl+V Ctrl+M.
LarsH

2
Outra solução alternativa para o Mac OS (testado no 10.13.6 High Sierra): Coloque a $antes da aspas simples que contém o comando sed: sed $'s/\r$//'Explicação: o bash decodifica escapes de barra invertida em $'...'seqüências de caracteres. Consulte gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html para obter detalhes.
jcsahnwaldt Restabelece Monica

127

Esta é uma versão aprimorada da resposta de Anne - se você usar perl, poderá editar o arquivo 'in-loco' em vez de gerar um novo arquivo:

perl -pi -e 's/\r\n|\n|\r/\r\n/g' file-to-convert  # Convert to DOS
perl -pi -e 's/\r\n|\n|\r/\n/g'   file-to-convert  # Convert to UNIX

5
O incrível desses scripts é que eles mostram, com as expressões regulares, EXATAMENTE o que a conversão de fim de linha precisa ser para converter em qualquer formato, começando de qualquer coisa.
PBR

tenha cuidado com isso em certas instalações do Cygwin / git bash em sistemas Windows. Isso pode lhe dar Can't do inplace edit on file: Permission denied.e excluir o arquivo. Procure outros utilitários.
Dennis

Muito obrigado por mostrar "Convert to Unix". Eu estava seguindo esse caminho e sua resposta dupla me ajudou, e recebi meu voto positivo.
null

112

Você pode instalar o unix2dos com o Homebrew

brew install unix2dos

Então você pode fazer isso:

unix2dos file-to-convert

Você também pode converter arquivos dos para unix:

dos2unix file-to-convert

9
Para quem se deparar com isso agora, a fórmula Homebrew agora é chamada dos2unix. Você vai querer brew install dos2unix.
Geoff

13
Na verdade, brew install unix2dosou brew install dos2unixfunciona bem. Eles instalam o mesmo pacote. Use qualquer nome fala com você :)
Steven Hirlston

2
Ou com Macports : port install dos2unix.
Fang

16

Você provavelmente quer o unix2dos :

$ man unix2dos

NAME
       dos2unix - DOS/MAC to UNIX and vice versa text file format converter

SYNOPSIS
           dos2unix [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]
           unix2dos [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]

DESCRIPTION
       The Dos2unix package includes utilities "dos2unix" and "unix2dos" to convert plain text files in DOS or MAC format to UNIX format and vice versa.  Binary files and non-
       regular files, such as soft links, are automatically skipped, unless conversion is forced.

       Dos2unix has a few conversion modes similar to dos2unix under SunOS/Solaris.

       In DOS/Windows text files line endings exist out of a combination of two characters: a Carriage Return (CR) followed by a Line Feed (LF).  In Unix text files line
       endings exists out of a single Newline character which is equal to a DOS Line Feed (LF) character.  In Mac text files, prior to Mac OS X, line endings exist out of a
       single Carriage Return character. Mac OS X is Unix based and has the same line endings as Unix.

Você pode executar unix2dosem sua máquina DOS / Windows usando o cygwin ou no seu Mac usando o MacPorts .


O unix2dos / dos2unix não existe no meu mac e eu não encontrei nenhum lugar para instalá-los. Você conhece algum?
Yarin

@mgadda: +1 - sim, eu mudei para o homebrew do MacPorts há um tempo e não olhei para trás.
Paul R

15

Basta trexcluir:

tr -d "\r" <infile.txt >outfile.txt

1
Tentei perl e sed, não funcionou (eu poderia ter descoberto, não valia a pena tentar). Isso funcionou muito bem.
RandomInsano

Esta foi a primeira solução que encontrei nos números de linha do BBEdit que não correspondiam à contagem de linhas quando eu os li usando Python (e não correspondendo wc -l).
Daryl Spitzer

1
isso exclui todas as quebras de linha Na verdade, eu ainda preciso ter quebras de linha, mas com \ n
UserYmY 10/02

" hints.macworld.com/article.php?story=20031018164326986 " também possui uma boa descrição de como usar o trcomando para realizar várias conversões. Use hexdumpou similar para descobrir exatamente que tipo de convenção de fim de linha agora é usada no arquivo.
Mike Robinson

6
  1. Instale o dos2unix com o homebrew
  2. Executar find ./ -type f -exec dos2unix {} \;para converter recursivamente todas as terminações de linha na pasta atual

2

vimtambém pode converter arquivos do formato UNIX para DOS. Por exemplo:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF

2

A seguir, é apresentado um script completo, com base nas respostas acima, junto com a verificação de integridade e funciona no Mac OS X e também deve funcionar em outros sistemas Linux / Unix (embora isso não tenha sido testado).

#!/bin/bash

# http://stackoverflow.com/questions/6373888/converting-newline-formatting-from-mac-to-windows

# =============================================================================
# =
# = FIXTEXT.SH by ECJB
# =
# = USAGE:  SCRIPT [ MODE ] FILENAME
# =
# = MODE is one of unix2dos, dos2unix, tounix, todos, tomac
# = FILENAME is modified in-place
# = If SCRIPT is one of the modes (with or without .sh extension), then MODE
# =   can be omitted - it is inferred from the script name.
# = The script does use the file command to test if it is a text file or not,
# =   but this is not a guarantee.
# =
# =============================================================================

clear
script="$0"
modes="unix2dos dos2unix todos tounix tomac"

usage() {
    echo "USAGE:  $script [ mode ] filename"
    echo
    echo "MODE is one of:"
    echo $modes
    echo "NOTE:  The tomac mode is intended for old Mac OS versions and should not be"
    echo "used without good reason."
    echo
    echo "The file is modified in-place so there is no output filename."
    echo "USE AT YOUR OWN RISK."
    echo
    echo "The script does try to check if it's a binary or text file for sanity, but"
    echo "this is not guaranteed."
    echo
    echo "Symbolic links to this script may use the above names and be recognized as"
    echo "mode operators."
    echo
    echo "Press RETURN to exit."
    read answer
    exit
}

# -- Look for the mode as the scriptname
mode="`basename "$0" .sh`"
fname="$1"

# -- If 2 arguments use as mode and filename
if [ ! -z "$2" ] ; then mode="$1"; fname="$2"; fi

# -- Check there are 1 or 2 arguments or print usage.
if [ ! -z "$3" -o -z "$1" ] ; then usage; fi

# -- Check if the mode found is valid.
validmode=no
for checkmode in $modes; do if [ $mode = $checkmode ] ; then validmode=yes; fi; done
# -- If not a valid mode, abort.
if [ $validmode = no ] ; then echo Invalid mode $mode...aborting.; echo; usage; fi

# -- If the file doesn't exist, abort.
if [ ! -e "$fname" ] ; then echo Input file $fname does not exist...aborting.; echo; usage; fi

# -- If the OS thinks it's a binary file, abort, displaying file information.
if [ -z "`file "$fname" | grep text`" ] ; then echo Input file $fname may be a binary file...aborting.; echo; file "$fname"; echo; usage; fi

# -- Do the in-place conversion.
case "$mode" in
#   unix2dos ) # sed does not behave on Mac - replace w/ "todos" and "tounix"
#       # Plus, these variants are more universal and assume less.
#       sed -e 's/$/\r/' -i '' "$fname"             # UNIX to DOS  (adding CRs)
#       ;;
#   dos2unix )
#       sed -e 's/\r$//' -i '' "$fname"             # DOS  to UNIX (removing CRs)
#           ;;
    "unix2dos" | "todos" )
        perl -pi -e 's/\r\n|\n|\r/\r\n/g' "$fname"  # Convert to DOS
        ;;
    "dos2unix" | "tounix" )
        perl -pi -e 's/\r\n|\n|\r/\n/g'   "$fname"  # Convert to UNIX
        ;;
    "tomac" )
        perl -pi -e 's/\r\n|\n|\r/\r/g'   "$fname"  # Convert to old Mac
        ;;
    * ) # -- Not strictly needed since mode is checked first.
        echo Invalid mode $mode...aborting.; echo; usage
        ;;
esac

# -- Display result.
if [ "$?" = "0" ] ; then echo "File $fname updated with mode $mode."; else echo "Conversion failed return code $?."; echo; usage; fi

1

Aqui está uma abordagem realmente simples, que funcionou bem para mim, cortesia do Weblog de Davy Schmeits :

cat foo | col -b > foo2

Onde foo é o arquivo que possui os caracteres Control + M no final da linha e foo2 o novo arquivo que você está criando.


0

No Yosemite OSX, use este comando:

sed -e 's/^M$//' -i '' filename

onde a ^Msequência é alcançada pressionando Ctrl+ e Vdepois Enter.


Observe também que sed não entendem barra invertida-escapa, como \re `` \ n` e, portanto, também pode usá-los na substituição. Na verdade, você não precisa inserir um controle-M literal para se referir a esse caractere (ou a qualquer outro). O princípio de usar sed(e -i) para fazer qualquer tipo de conversão desse tipo é muito bom, porque, diferentemente tr, você não está limitado a "um caractere de cada vez".
Mike Robinson

0

Expandindo as respostas de Anne e JosephH, usando perl em um script curto de perl, já que tenho preguiça de digitar o perl-one-liner muito tempo.
Crie um arquivo nomeado, por exemplo, "unix2dos.pl" e coloque-o em um diretório em seu caminho. Edite o arquivo para conter as 2 linhas:

#!/usr/bin/perl -wpi
s/\n|\r\n/\r\n/g;

Supondo que "qual perl" retorne "/ usr / bin / perl" em seu sistema. Torne o arquivo executável (chmod u + x unix2dos.pl).

Exemplo:
$ echo "hello"> xxx
$ od -c xxx (verificando se o arquivo termina com um nl)
0000000 olá \ n

$ unix2dos.pl xxx
$ od -c xxx (verificando se termina agora em cr lf)
0000000 olá \ r \ n


0

No Xcode 9, no painel esquerdo, abra / escolha seu arquivo no navegador do projeto . Se o arquivo não estiver lá, remova-o e solte-o no navegador do projeto .

No painel direito, localize Configurações de texto e altere Terminais de linha para Windows (CRLF) .

XCode screendumpscreendump do XCode

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.