Como você procura arquivos contendo terminações de linha DOS (CRLF) com grep no Linux?

StackOverflow https://stackoverflow.com/questions/73833

  •  09-06-2019
  •  | 
  •  

Pergunta

Quero procurar arquivos contendo terminações de linha DOS com grep no Linux.Algo assim:

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

O texto acima parece corresponder literalmente rn o que não é o desejado.

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

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
Foi útil?

Solução

Usar Ctrl+V, Ctrl+M para inserir um caractere literal de retorno de carro em sua string grep.Então:

grep -IUr --color "^M"

funcionará - se o ^M há um CR literal que você inseriu conforme sugeri.

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

Explicação

  • -I ignorar arquivos binários
  • -U impede que o grep remova os caracteres CR.Por padrão, faria isso se decidisse que é um arquivo de texto.
  • -r leia todos os arquivos em cada diretório recursivamente.

Outras dicas

grep provavelmente não é a ferramenta que você deseja para isso.Ele 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, grep não é a melhor maneira de fazer isso.Usar find para executar o arquivo em todos os arquivos da árvore e, em seguida, percorrer isso para "CRLF" fornecerá uma linha de saída para cada arquivo que possui finais de linha no estilo DOS:

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

você receberá 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

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

grep -lUP '\r$'

poderia ser usado.

# 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

A consulta foi pesquisa...Eu tenho um problema semelhante ...alguém enviou linha mista termina no controle de versão, então agora temos um monte de arquivos com 0x0d 0x0d 0x0a finais de linha.Observe que

grep -P '\x0d\x0a'

encontra todas as linhas, enquanto

grep -P '\x0d\x0d\x0a'

e

grep -P '\x0d\x0d'

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

Se, como eu, o seu unix minimalista não inclui sutilezas como o arquivo comando e barras invertidas em seu grep expressões simplesmente não cooperam, tente isto:

$ 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 acima incluem:

  • ajustar o encontrar comando para localizar apenas os arquivos que você deseja verificar
  • mudar o jogar fora comando para ah ou qualquer utilitário de despejo de arquivo que você tenha
  • confirmar que o corte O comando inclui um espaço à esquerda e à direita, bem como apenas a saída de caracteres hexadecimais do jogar fora Utilitário
  • limitar o jogar fora saída para os primeiros 1.000 caracteres ou mais para eficiência

Por exemplo, algo assim pode funcionar para você usando ah em vez de jogar fora:

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

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

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top