Remover retorno de carro no Unix
-
03-07-2019 - |
Pergunta
O que é a maneira mais simples para remover todos os retornos de carro \r
de um arquivo no Unix?
Solução
Eu estou indo supor que você retornos de carro médios ( CR , "\r"
, 0x0d
) no extremidades de linhas, em vez de apenas cega dentro de um arquivo (você pode ter -los no meio de cordas pelo que sei). Usando este arquivo de teste com um CR no final da primeira linha apenas:
$ cat infile
hello
goodbye
$ cat infile | od -c
0000000 h e l l o \r \n g o o d b y e \n
0000017
dos2unix
é o caminho a percorrer se ele estiver instalado em seu sistema:
$ cat infile | dos2unix -U | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
Se por algum motivo dos2unix
não está disponível para você, então sed
vai fazê-lo:
$ cat infile | sed 's/\r$//' | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
Se por algum motivo sed
não está disponível para você, então ed
vai fazê-lo, de uma forma complicada:
$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
Se você não tiver qualquer dessas ferramentas instaladas em sua caixa, você tem problemas maiores do que tentar Converter arquivos: -)
Outras dicas
tr -d '\r' < infile > outfile
Old School:
tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
Há um utilitário chamado dos2unix que existe em muitos sistemas, e pode ser facilmente instalado na maioria.
A maneira mais simples no Linux é, na minha humilde opinião,
sed -i 's/\r$//g' <filename>
citações fortes em todo o 's/\r//'
operador de substituição são essencial . Sem eles o shell vai interpretar \r
como uma fuga + r e reduzi-lo a um r
simples, e remover todos r
minúsculas. É por isso que a resposta dada acima em 2009 por Rob não funciona.
e adicionando o garante modificadoras /g
que mesmo \r
múltipla serão removidos, e não só o primeiro.
sed -i s/\r// <filename>
ou algo assim; veja man sed
ou a riqueza de informações disponíveis na web a respeito do uso de sed
.
Uma coisa a salientar é o significado preciso de "retorno de carro" na acima; se você realmente quer dizer o único controle caráter "retorno de carro", então o padrão acima é correta. Se você quis dizer, de modo mais geral, CRLF (retorno de carro e uma alimentação de linha, que é como avanços de linha são implementados no Windows), então você provavelmente vai querer substituir \r\n
vez. alimentações de linha bare (nova linha) em Linux / Unix são \n
.
Se você é um usuário Vi, você pode abrir o arquivo e remover o retorno de carro com:
:%s/\r//g
ou com
:1,$ s/^M//
Note que você deve digitar ^ M pressionando ctrl-v e depois ctrl-m.
Uma vez mais uma solução ... Porque há sempre mais uma:
perl -i -pe 's/\r//' filename
É bom porque é no lugar e obras em todos os sabores de unix / linux Eu já trabalhei com.
Alguém recomendar dos2unix
e eu recomendo fortemente-lo também. Estou apenas fornecer mais detalhes.
Se instalado, pule para a próxima etapa. Se não estiver instalado, eu recomendo instalá-lo via yum
como:
yum install dos2unix
Em seguida, você pode usá-lo como:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
Aqui está a coisa,
%0d
é o caráter de retorno de carro. Para torná-lo compatabile com Unix. Precisamos usar o comando abaixo.
dos2unix fileName.extension fileName.extension
tentar isso para converter dos arquivos em arquivo UNIX:
arquivo fromdos
Se você estiver usando um sistema operacional (como o OS X) que não tem o comando dos2unix
mas tem um interpretador Python (versão 2.5+), este comando é equivalente ao comando dos2unix
:
python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"
Este alças ambos os arquivos nomeados na linha de comando, bem como tubos e redirecionamentos, assim como dos2unix
. Se você adicionar esta linha ao seu arquivo ~ / .bashrc (ou arquivo de perfil equivalente para outras conchas):
alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""
... da próxima vez que fizer login (ou source ~/.bashrc
prazo na sessão atual), você vai ser capaz de usar o nome dos2unix
na linha de comando da mesma forma como nos outros exemplos.
Para UNIX ... Eu dos2unix notado removido cabeçalhos Unicode formar meu arquivo UTF-8. Sob o bash git (Windows), o seguinte script parece funcionar bem. Ele usa sed. Observe que apenas remove o transporte de volta nas extremidades de linhas, e preserva cabeçalhos Unicode.
#!/bin/bash
inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"
Se você estiver executando um ambiente X e ter um editor adequado (código visual studio), então gostaria de seguir a recomendação:
Visual Código Estúdio: Como mostrar finais de linha
Basta ir para o canto inferior direito da tela, código visual studio irá mostrar-lhe tanto a codificação do arquivo e o fim da linha convenção seguido pelo arquivo, um apenas com um simples clique você pode mudar esta situação.
Basta usar código visual como seu substituto para o notepad ++ em um ambiente Linux e está pronto para ir.
Eu tenho python usado para ele, aqui meu código;
end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
with open(end2, "w") as fixed:
for line in inf:
line = line.replace("\n", "")
line = line.replace("\r", "")
fixed.write(line)
Embora seja um post antigo, recentemente me deparei com o mesmo problema. Como eu tinha todos os arquivos para renomear dentro / tmp / blah_dir / como cada arquivo neste diretório tinha "/ r" arrastando caracteres (mostrando "?" No final do arquivo), de modo a fazê-lo roteiro maneira foi somente eu poderia pensar.
Eu queria salvar o arquivo final com mesmo nome (sem arrastando qualquer caractere). Com sed, problema foi o nome do arquivo de saída que eu era necessária a menção alguma outra coisa (que eu não queria).
Eu tentei outras opções sugeridas aqui (não consideradas dos2unix por causa de algumas limitações), mas não funcionou.
Eu tentei com "awk", finalmente, que trabalhou onde eu costumava "\ r" como delimitador e levado a primeira parte :
truque é:
echo ${filename}|awk -F"\r" '{print $1}'
Abaixo roteiro trecho I utilizado (onde eu tinha todos os arquivos tinha "\ r", como arrastando personagem no caminho / tmp / blah_dir /) para corrigir o meu problema:
cd /tmp/blah_dir/
for i in `ls`
do
mv $i $(echo $i | awk -F"\r" '{print $1}')
done
Nota: Este exemplo não é muito exata, embora perto do que eu trabalhava (mencionar aqui apenas para dar a ideia melhor sobre o que eu fiz)
você pode simplesmente fazer isso:
$ echo $(cat input) > output