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?
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?
Respostas:
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.
find . -name '*.txt' -print0 | xargs -null fromdos
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]
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!
Eu faço isso no Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
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.
Alt+d
. Às vezes, alt é interceptado pelo programa do terminal, então você pode usá-lo esc+d
.
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\n
com \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
.
\r\n
para \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. ;)
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.
CR LF
para LF
usar 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}
).
LF
para 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
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 .