Pergunta

O que é a maneira mais simples para remover todos os retornos de carro \r de um arquivo no Unix?

Foi útil?

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

tr (1)

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top