grep para localizar arquivos que contenham ^ M (retorno de carro do Windows)

60

Eu uso o Linux. Há um pesky ^ M (retorno caria do Windows) em algum lugar escondido em milhares de arquivos de configuração, e eu tenho que encontrá-lo, porque faz o servidor falhar.

Como faço para encontrar ^ M entre uma hierarquia de diretórios cheia de arquivos de configuração?

Acho que não consigo digitar ^ M na linha de comando do bash. Mas eu tenho isso em um arquivo de texto que eu chamei m.txt

    
por Nicolas Raoul 01.10.2010 / 07:44

7 respostas

81
grep -r $'\r' *

Use -r para pesquisa recursiva e $'' para escape no estilo c no Bash.

Mais, se você tiver certeza de que é um arquivo de texto, deve ser seguro executar

tr -d $'\r' < filename

para remover todos os \r em um arquivo.

Se você usar o GNU sed , -i poderá realizar a edição no local, não será necessário escrever novamente:

sed $'s/\r//' -i filename
    
por 01.10.2010 / 07:51
12

Quando tentei, percebi que estava funcionando, mas as linhas estavam imprimindo em branco. Adicione a opção:

--color=never

Se você receber esse problema, acho que os caracteres de escape para realce de cor estão interferindo no caractere \r .

    
por 26.07.2012 / 00:58
2

Se o seu servidor não tiver um bash shell, uma alternativa é usar a opção -f em grep , em combinação com um arquivo preparado contendo \r .

Para criar o arquivo:

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

Para realmente fazer a pesquisa

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

ou você pode ser um pouco preguiçoso e apenas digitar *,

$ grep -f /tmp/cr *

A opção -f filename em grep é usada para especificar um arquivo que contenha padrões para corresponder, um por linha. Neste caso, há apenas um padrão.

    
por 29.09.2011 / 10:56
1

Para usar o grep em caracteres de final de linha, eu acho que você tem que dizer ao grep que o arquivo é binário.

-l (letra L) é para imprimir apenas o nome do arquivo

-P é para regexp em perl (então \ x0d é transformado em \ r ou ^ M)

grep -l --binary -P '\x0d' *
    
por 23.08.2016 / 13:00
0

Se você estiver usando um Mac e usar homebrew , poderá fazer:

brew install tofrodos
fromdos file.txt

para remover todos os retornos de carro do Windows de arquivo.txt

Para voltar aos retornos de carro do Windows,

todos file.txt
    
por 10.10.2011 / 07:11
0

No estilo de expressão regular, várias novas linhas:

Windows (CR LF) em \r\n

Unix (LF) - \n

Como a sequência \r\n é bastante exclusiva, acho que você deve ser capaz de pesquisá-la dessa maneira?

Para piorar, os Macs costumavam ter apenas '\ r' no lugar da nova linha. Eu não posso verificar isso, mas eu não acho que as gerações MacOSX faz mais isso.

Macs mais antigos (CR) - \r

    
por 01.10.2010 / 07:48
0

Seguindo as respostas anteriores, o método 'tr' é bom:

533 $ if [[-n " tr -cd "\r" <~/.bashrc "]]; então echo "DOS"; else echo "UNIX"; fi

UNIX

534 $ if [[-n " tr -cd "\r" <dosfile.txt "]]; então echo "DOS"; else echo "UNIX"; fi

DOS

    
por 21.11.2014 / 07:23

Tags