it-swarm-pt.tech

Como você procura arquivos que contenham terminações de linha dos (CRLF) com grep no Linux?

Quero procurar arquivos que contenham terminações de linha dos com grep no Linux. Algo assim:

grep -IUr --color '\r\n' .

O texto acima parece corresponder ao literal rn, que não é o desejado.

A saída disso será canalizada através de xargs em todos para converter crlf em lf como este

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
113
Tim Abell

Usar Ctrl+VCtrl+M para inserir um caractere literal de retorno de carro em sua string grep. Assim:

grep -IUr --color "^M"

funcionará - se o ^M houver um CR literal que você insira como sugeri.

Se você deseja a lista de arquivos, também deseja adicionar a opção -l.

Explicação

  • -I ignora arquivos binários
  • -U evita que o grep retire caracteres CR. Por padrão, ele faria isso se decidir que é um arquivo de texto.
  • -r lê todos os arquivos em cada diretório recursivamente.
110
pjz

grep provavelmente não é a ferramenta que você deseja para isso. Irá imprimir uma linha para cada linha correspondente em cada arquivo. A menos que você queira, digamos, executar todos 10 vezes em um arquivo de 10 linhas, o grep não é a melhor maneira de fazer isso. Usar o find para executar o arquivo em todos os arquivos da árvore e, em seguida, procurar por "CRLF" obterá uma linha de saída para cada arquivo que possui finais de linha com estilo dos:

find . -not -type d -exec file "{}" ";" | grep CRLF

você terá algo como:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators
143
Thomee
49
Steven Penny

Se sua versão do grep suportar a opção - P (--Perl-regexp), então

grep -lUP '\r$'

poderia ser usado.

16
Linulin
# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative
7
yabt

A consulta foi de pesquisa ... Eu tenho um problema semelhante ... alguém enviou finais de linha mistos no controle de versão, então agora temos um monte de arquivos com a linha 0x0d0x0d0x0a line terminações. Observe que

grep -P '\x0d\x0a'

encontra todas as linhas, enquanto

grep -P '\x0d\x0d\x0a'

e

grep -P '\x0d\x0d'

não encontra nenhuma linha, então pode haver algo "mais" acontecendo dentro do grep quando se trata de padrões de final de linha ... infelizmente para mim!

3
Peter Y

Você pode usar o comando file no unix. Ele fornece a codificação de caracteres do arquivo junto com os terminadores de linha.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
2
Murali Krishna Parimi

Se, como eu, seu unix minimalista não inclui detalhes como o comando file, e barras invertidas em suas expressões grep simplesmente não cooperam, tente o seguinte:

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

As modificações que você pode querer fazer no item acima incluem:

  • Ajuste o comando find para localizar apenas os arquivos que você deseja verificar
  • altere o comando dump para od ou qualquer outro utilitário de despejo de arquivo que você tenha
  • confirme se o comando cut inclui um espaço à esquerda e à direita, bem como apenas a saída de caracteres hexadecimais do utilitário dump
  • limite a saída dump para os primeiros 1000 caracteres ou mais, para obter eficiência

Por exemplo, algo assim pode funcionar para você usando od em vez de dump:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
1
MykennaC