Converta CRLFs em feeds de linha no Linux

34

Qual é a melhor maneira de converter CRLFs em feeds de linha em arquivos no Linux?

Eu já vi comandos sed , mas há algo mais simples?

JoelFan
fonte
4
Dupe: superuser.com/questions/38744/… . O link fornecido na resposta aceita abrange as opções dos2unix, perl e vi, entre outras.
Nagul 7/10/09
2
Isso já tem melhores respostas embora (por isso, se um deles é para ser fechado, ele provavelmente deve ser aquele)
Jonik

Respostas:

40

Use este comando:

fromdos yourtextfile

O contrário:

todos yourtextfile

Esses comandos são encontrados no pacote tofrodos (nas distribuições mais recentes), que também fornece os dois wrappers unix2dos e dos2unix que imitam as ferramentas unix antigas com o mesmo nome.

avelldiroll
fonte
2
+1 Muito mais útil do que a resposta "Usar dos2unix" atualmente mais votada.
911 Jonik
1
Sim, até eu estou votando neste. A minha foi mais uma sugestão de drive-by.
Ryan C. Thompson
Eu daria bônus extra se você disser como torná-lo recursivo. Atualmente, funciona apenas com caracteres curinga.
sorin
2
@SorinSbarnea: algo comofind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@ Jonik o que o torna "Muito mais útil"? Pergunta séria
andrewtweber
24

Use dos2unix.

dos2unix - conversor de formato de arquivo de texto DOS / MAC para UNIX

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Ryan C. Thompson
fonte
2
e unix2dos para o contrário.
quack quixote
Quack, você está me seguindo? Não que eu não goste, com todos os votos positivos.
23919 Ryan C. Thompson
1
cara, eu sou ~ charlatão. pronuncie "~" como "não". :) mas não, não te seguindo, embora eu pareço te encontrar com frequência.
quack quixote
1
Considere elaborar como obter esse utilitário para o seu sistema Linux. Pelo menos no Ubuntu não é instalado por padrão (mas instalando o pacote tofrodos, você obtém algo muito semelhante: packages.ubuntu.com/jaunty/tofrodos ).
7119 Jonik
20

Eu prefiro perl :

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

Mas isso é adequado para meus usos e é muito fácil me lembrar. Nem todos os sistemas possuem um comando dos2unix, mas a maioria dos quais trabalho possui um intérprete perl.

Outro é recode , um poderoso substituto para dos2unix e iconv; está disponível no pacote "recode" nos repositórios Debian:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

Para fãs do awk :

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

... e sed :

sed 's/\r$//' winfile.txt > unixfile.txt

E agora, apenas um pouco menos complicado do que excluir os CRs manualmente em um editor hexadecimal, diretamente de um de nossos amigos stackoverflow.com , utilizável com o intérprete de carne bovina (localizado no repositório Debian de sua vizinhança),

dos2unix em brainfuck !

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

muito obrigado a jk por perder uma hora de sua vida escrevendo isso!

charlatão quixote
fonte
1
(uso inútil de gato e) perl é tão complicado como sed ... assim, você não está realmente respondendo à pergunta, mas sim recolher reputação :)
akira
2
"melhor caminho" é subjetivo. isso funciona melhor para mim (estou muito mais confortável com perl do que sed). Não prometi que funcionaria melhor para você.
quack quixote
@akira: uma pergunta pode ter várias respostas válidas. Também uso esse método, ocasionalmente, principalmente em combinação com outras alterações, por isso é definitivamente uma resposta válida; mas "use dos2unix" é definitivamente a resposta mais prática na maioria das situações. Então eu acho que as classificações são boas.
Reinierpost 7/10/09
@akira: se você achar mais simples, poste como resposta e ilumine o resto de nós.
quack quixote
@ ~ charlatão: esse é o ponto: não é mais simples. isso é o mesmo para a sua resposta perl. u2d ou fromdos / todos são as respostas corretas, porque são mais simples do que qualquer coisa expressa em qualquer outra linguagem de programação.
Akira
9

Eu faço isso no Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
fonte
legais. eu vi outra menção de tr hoje cedo. não é um programa que é mencionado com muita frequência, é?
quack quixote
7

Eu acho que você pode usar trtambém (embora eu não tenha arquivos de formato engraçado para tentar):

tr -d '\r' < file1 > file2
Warren
fonte
4

No vi ou no Vim :

:%s/^V^M//g
fpmurphy
fonte
4

Eu achei uma maneira muito fácil… Abrir arquivo com nano: ## nano file.txt

pressione Ctrl + O para salvar, mas antes de pressionar Enter, pressione: Alt + D para alternar entre finais de linha DOS e Unix / Linux, ou: Alt + M para alternar entre finais de linha Mac e Unix / Linux e pressione Enter para salvar e Ctrl + X para sair.

Stefan Sjöberg
fonte
1
Você poderia editar sua resposta para esclarecer quais configurações de alternância replicarão o comportamento solicitado pelo OP?
Burgi
O OP quer desativar as terminações de linha do DOS, então Alt+d. Às vezes, alt é interceptado pelo programa do terminal, então você pode usá-lo esc+d.
spinup 25/08/16
1
Muitos nano atalhos também funcionam com o Shift pressionado, o que geralmente impede a interceptação de terminal, então o 'Alt-Shift-D' também funciona.
precisa saber é o seguinte
3

Eu prefiro Vim e :set fileformat=unix. Embora não seja o mais rápido, ele me dá uma prévia. É especialmente útil no caso de um arquivo com finais mistos.

opello
fonte
1

Se você deseja um método GUI, tente o editor de texto do Kate (outros editores de texto avançados também podem lidar com isso). Abra o achado / substituir diálogo ( Ctrl+ R), e substituir \r\ncom \n. (NB: você precisará escolher "Expressão regular" na lista suspensa e desmarcar "Somente seleção" nas opções.)

EDIT: Ou, se você simplesmente deseja converter para o formato Unix, em seguida, usar a opção de menu Tools> End of Line> Unix.

DisgruntledGoat
fonte
Existem editores de texto, como o jEdit, que podem fazer essas transformações automaticamente - basta dizer se você deseja separadores de linhas Unix, Windows ou Mac.
7119 Jonik
Na verdade, o KATE também pode fazer isso no menu Ferramentas> Fim de linha . Talvez eu devesse ter pensado mais lateralmente do que responder a pergunta exatamente como ele foi redigido - mas se você sabe que você quer especificamente para converter \r\npara \n, em seguida, usando a pesquisa / substituição é mais fácil do que lembrar que os usos do sistema operacional que de fim de linha. ;)
DisgruntledGoat
1

Cole isso no script Python dos2unix.py .

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

Deve funcionar em qualquer plataforma com o Python instalado. Domínio público.

anatoly techtonik
fonte
1

CR LFpara LFusar o awk :

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Exemplo de uso:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Explicação:

-v RS='\r?\n'conjuntos RS variáveis ( entrada r ecord s eparator) para \r?\n, ou seja, entrada é lido linha por linha separada por LF ( \n) que pode ( ?) ser precedida por CR ( \r).

1é o script que o awk executa. Um script consiste em condition { action }. Nesse caso, 1é a condição que é avaliada como verdadeira. A ação é omitida; portanto, a ação padrão é executada, o que significa imprimir a linha atual (que também pode ser escrita como {print $0}ou simplesmente {print}).


LFpara CR LF: É possível definir a variável ORS( o utput r ecord s eparator) para modificar as extremidades da linha de saída. Exemplo:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Martin
fonte
0

Eu usei esse script para arquivos que eu precisava para transferir arquivos de emergência de um sistema Windows para um sistema Unix.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Localiza todos os arquivos, recursivamente no diretório em que você está executando o comando

xargs file

Passe-o para o programa de arquivos para obter uma análise do arquivo.

grep CRLF

Queremos apenas a saída do arquivo que mostra CRLF.

cut -d: -f1

Obtenha a saída até a cor. descartar o resto. Devemos ter apenas um nome de arquivo agora

xargs dos2unix

Passe o nome do arquivo para o programa dos2unix usando xargs .

Tschallacka
fonte