Como programaticamente (ou seja, não estou usando vi
) converter novas linhas de DOS / Windows para Unix?
Os comandos dos2unix
e unix2dos
não estão disponíveis em determinados sistemas. Como posso emular estes com comandos como sed
/ awk
/ tr
?
dos2unix
usando o gerenciador de pacotes, é realmente muito mais simples e existe na maioria das plataformas.Respostas:
Você pode usar
tr
para converter do DOS para o Unix; no entanto, você só poderá fazer isso com segurança se o CR aparecer no seu arquivo apenas como o primeiro byte de um par de bytes CRLF. Este é geralmente o caso. Você então usa:Observe que o nome
DOS-file
é diferente do nomeUNIX-file
; se você tentar usar o mesmo nome duas vezes, acabará sem dados no arquivo.Você não pode fazer o contrário (com o padrão 'tr').
Se você souber inserir retorno de carro em um script ( control-V, control-Mpara inserir control-M), então:
onde o '^ M' é o caractere control-M. Você também pode usar o mecanismo de
bash
cotação ANSI-C para especificar o retorno de carro:No entanto, se você precisar fazer isso com muita frequência (mais de uma vez, grosso modo), é muito mais sensato instalar os programas de conversão (por exemplo ,
dos2unix
eunix2dos
, ou talvezdtou
eutod
) e usá-los.Se você precisar processar diretórios e subdiretórios inteiros, poderá usar
zip
:Isso criará um arquivo zip com as terminações de linha alteradas de CRLF para CR.
unzip
Em seguida, os arquivos convertidos serão restaurados (e você solicitará arquivo por arquivo - você poderá responder: Sim para todos). Créditos para @vmsnomad por apontar isso.fonte
tr -d '\015' <DOS-file >UNIX-file
whereDOS-file
==UNIX-file
apenas resulta em um arquivo vazio. O arquivo de saída deve ser um arquivo diferente, infelizmente.sed
opção GNU-i
(no local) funciona; os limites são arquivos vinculados e links simbólicos. Osort
comando 'always' (desde 1979, se não for anterior) suportou a-o
opção que pode listar um dos arquivos de entrada. No entanto, isso é em parte porquesort
deve ler todas as suas entradas antes que possa gravar qualquer uma de suas saídas. Outros programas suportam esporadicamente a substituição de um de seus arquivos de entrada. Você pode encontrar um programa de uso geral (script) para evitar problemas no 'The UNIX Programming Environment' da Kernighan & Pike.sed -i $'s/\r$//' filename
- para editar no local. Como estou trabalhando em uma máquina que não tem acesso à Internet, a instalação do software é um problema.veja aqui exemplos usando
sed
:Use
sed -i
para conversão no local, por exemplosed -i 's/..../' file
.fonte
\r
:tr "\r" "\n" < infile > outfile
-d
é apresentado com mais frequência e não ajudará na\r
situação " única ".\r
ao\n
mapeamento tem o efeito de espaçamento duplo dos arquivos; cada linha CRLF que termina no DOS se torna\n\n
no Unix.Fazer isso com o POSIX é complicado:
O POSIX Sed não suporta
\r
ou\15
. Mesmo se tiver, a opção no local-i
não é POSIXO POSIX Awk suporta
\r
e\15
, no entanto, a-i inplace
opção não é POSIXO d2u e o dos2unix não são utilitários POSIX , mas ex é
POSIX ex não suporta
\r
,\15
,\n
ou\12
Para remover retornos de carro:
Para adicionar retornos de carro:
fonte
tr
suporta\r
. Portanto, você também pode usarprintf '%s\n' '%!tr -d "\r"' x | ex file
(embora concedido, isso foi removido,\r
mesmo que não imediatamente anterior\n
). Além disso, a-b
opção paraex
não é especificada pelo POSIX.Você pode usar o vim programaticamente com a opção -c {command}:
Dos para Unix:
Unix para dos:
"definir ff = unix / dos" significa alterar o formato do arquivo (ff) do arquivo para o formato final de linha do Unix / DOS
": wq" significa gravar o arquivo no disco e sair do editor (permitindo usar o comando em um loop)
fonte
vi
sabe o que:wq
significa. Para aqueles que não os 3 caracteres significam 1) abra a área de comando vi, 2) escreva e 3) saia.Usando o AWK, você pode:
Usando Perl você pode fazer:
fonte
awk
.Para converter um arquivo no local, use
Para gerar texto convertido para um arquivo diferente, use
Você pode instalá-lo no Ubuntu ou Debian com
ou no macOS usando homebrew
fonte
Esse problema pode ser resolvido com ferramentas padrão, mas existem muitos traps para os incautos que eu recomendo que você instale o
flip
comando, que foi escrito há mais de 20 anos por Rahul Dhesi, autor dezoo
. Ele faz um excelente trabalho na conversão de formatos de arquivo e, por exemplo, evita a destruição inadvertida de arquivos binários, o que é um pouco fácil demais se você apenas alterar todos os CRLF que vê ...fonte
As soluções postadas até agora tratam apenas de parte do problema, convertendo o CRLF do DOS / Windows no LF do Unix; a parte que falta é que o DOS use CRLF como separador de linhas , enquanto o Unix use LF como terminador de linhas . A diferença é que um arquivo DOS (geralmente) não terá nada após a última linha do arquivo, enquanto o Unix terá. Para fazer a conversão corretamente, você precisa adicionar o LF final (a menos que o arquivo tenha tamanho zero, ou seja, não possui linhas). Meu encantamento favorito para isso (com um pouco de lógica adicional para lidar com arquivos separados por CR no estilo Mac, e não molestar arquivos que já estão no formato unix) é um pouco de perl:
Observe que isso envia a versão Unixified do arquivo para stdout. Se você deseja substituir o arquivo por uma versão Unixified, adicione o
-i
sinalizador do perl .fonte
Se você não tem acesso ao dos2unix , mas pode ler esta página, pode copiar / colar o dos2unix.py daqui.
Postada cruzada do superusuário .
fonte
dos2unix
converte todos os arquivos de entrada por padrão. Seu uso implica-n
parâmetro. E o realdos2unix
é um filtro que lê stdin, grava no stdout se os arquivos não forem fornecidos.Super fácil com PCRE;
Como um script ou substitua
$@
pelos seus arquivos.fonte
--
. Eu escolhi essa solução porque é fácil de entender e se adaptar para mim. FYI, este é o que os interruptores fazer:-p
assumir um loop "enquanto a entrada",-i
arquivo de entrada de edição no local,-e
executar seguinte comandoUma solução awk ainda mais simples sem um programa:
Tecnicamente '1' é o seu programa, o b / c awk requer um quando é dada a opção.
ATUALIZAÇÃO : Depois de revisitar esta página pela primeira vez em muito tempo, percebi que ninguém ainda havia publicado uma solução interna, então aqui está uma:
fonte
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
oused
solução. Além disso, você deve usarwhile IFS= read -r line
para preservar fielmente as linhas de entrada, caso contrário, os espaços em branco à esquerda e à direita são aparados (como alternativa, não use nenhum nome de variável noread
comando e trabalhe com$REPLY
).Curiosamente no meu git-bash no Windows
sed ""
já fiz o truque:Meu palpite é que o sed os ignora ao ler as linhas da entrada e sempre escreve finais de linha unix na saída.
fonte
Isso funcionou para mim
fonte
Só tive que refletir sobre a mesma pergunta (no lado do Windows, mas igualmente aplicável ao Linux.) Surpreendentemente, ninguém mencionou uma maneira muito automatizada de fazer a conversão CRLF <-> LF para arquivos de texto usando a boa e velha
zip -ll
opção (Info-ZIP):NOTA: isso criaria um arquivo zip preservando os nomes originais, mas convertendo as terminações de linha em LF. Em seguida
unzip
, extrairia os arquivos como zipados, ou seja, com seus nomes originais (mas com terminações LF), solicitando a substituição dos arquivos originais locais, se houver.Trecho relevante de
zip --help
:fonte
Para o Mac osx, se você tiver o homebrew instalado [ http://brew.sh/{/1]
Verifique se você fez cópias dos arquivos, pois este comando modificará os arquivos no local. A opção -c mac torna o switch compatível com osx.
fonte
-c mac
, o que é para converterCR
apenas novas linhas anteriores ao OS X. Você deseja usar esse modo apenas para arquivos de e para o Mac OS 9 ou anterior.TIMTOWTDI!
Baseado em @GordonDavisson
É preciso considerar a possibilidade de
[noeol]
...fonte
Você pode usar o awk. Defina o separador de registro (
RS
) como uma expressão regular que corresponda a todos os caracteres ou caracteres de nova linha possíveis. E defina o separador de registro de saída (ORS
) como o caractere de nova linha no estilo unix.fonte
git diff
mostra ^ M, editado no vim)No Linux, é fácil converter ^ M (ctrl-M) em * nix novas linhas (^ J) com sed.
Será algo assim na CLI, haverá realmente uma quebra de linha no texto. No entanto, o \ passa esse ^ J para sed:
Você obtém isso usando ^ V (ctrl-V), ^ M (ctrl-M) e \ (barra invertida) enquanto digita:
fonte
Como a pergunta menciona o sed, esta é a maneira mais direta de usar o sed para conseguir isso. O que a expressão diz é substituir todo retorno de carro e avanço de linha por apenas apenas avanço de linha. É disso que você precisa quando passa do Windows para o Unix. Eu verifiquei que funciona.
fonte
Como uma extensão da solução Unix para DOS de Jonathan Leffler, para converter com segurança para o DOS quando você não tiver certeza das terminações de linha atuais do arquivo:
Isso verifica se a linha ainda não termina em CRLF antes de converter em CRLF.
fonte
Eu criei um script com base na resposta aceita para que você possa convertê-lo diretamente sem precisar de um arquivo adicional no final e remover e renomear posteriormente.
apenas verifique se você possui um arquivo como "file1.txt" que "file1.txt2" ainda não exista ou será substituído, use-o como um local temporário para armazenar o arquivo.
fonte
Com o bash 4.2 e mais recente, você pode usar algo parecido com isto para remover o CR à direita, que usa apenas os built-ins do bash:
fonte
Tentei sed / ^ M $ // 'file.txt no OSX, bem como vários outros métodos ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- finais de linha dos ou http://hintsforums.macworld.com/archive/index.php/t-125.html ). Nenhum funcionou, o arquivo permaneceu inalterado (entre Ctrl-v Enter era necessário para reproduzir ^ M). No final, eu usei o TextWrangler. Não é estritamente linha de comando, mas funciona e não se queixa.
fonte