quebra de linha em um arquivo dos dos linebreaks?

0

Eu tenho o arquivo do DOS por padrão preenchendo com CRLF como disjuntores de linha. Mas, algumas vezes eu recebo LF em vez de CRLF. Eu preciso descobrir onde exatamente a mudança está ocorrendo para quebras de linha.E eu não quero substituir LF com CRLF.Apenas para olhar para a mudança de registro com o separador de linha

    
por Kiran 10.01.2018 / 21:17

3 respostas

3

Dado o seguinte exemplo:

$ cat -et file
122323432.....^M$
4354363645....^M$
45234564655...$
34r52435346...^M$
122323432.....^M$

(onde cat -et é usado para exibir os finais de linha) então

$ awk '{last = $0} NR==1 {cr = /^M$/ ? 0 : 1; next} cr == 0 && /^M$/ {print last; cr = 1} cr == 1 && !/^M$/ {print last; cr = 0}' file | cat -et
4354363645....^M$
45234564655...$
34r52435346...^M$

em que ^M são inseridos como caracteres CR reais usando Ctrl + V Digite por exemplo.

Aqui está uma tentativa literal de uma python translation:

#!/usr/bin/python3

import re

p = re.compile(r'.*\r$')

with open('file', 'r', newline='') as f:
    for idx, line in enumerate(f):
        last = line
        m = p.match(line)
        if (idx==0):
            cr = 0 if m else 1
        if (cr==0) and m:
            print(last, end='')
            cr = 1
        elif (cr==1) and not m:
            print(last, end='')
            cr = 0
    
por 10.01.2018 / 21:23
1

Se o seu sistema tiver cat com a opção -e , você poderá usá-lo para ver o retorno do carro. Aqui, a primeira linha tem um CR (mostrado como ^M ), o segundo não.

$ cat -e crlf
foo^M$
bar$

(Embora se algum coringa escrever uma combinação de caracteres circulares + M em seu arquivo, ele terá a mesma aparência de um CR.)

Como alternativa, use less -U (desde que -r não seja fornecido), ele mostra retornos de carro de maneira semelhante como ^M , mas em cores inversas.

    
por 10.01.2018 / 21:20
1

Com o GNU grep:

grep --binary -v $'\r'$ dosfile

Exemplo de entrada (com um coringa na linha 3 segurando um sinal de intercalação e um M):

$ cat -e dosfile
line1^M$
line2^M$
line3 joker ^M^M$
line4^M$
line5^M$
line6$
line7$

$ od -c dosfile
0000000   l   i   n   e   1  \r  \n   l   i   n   e   2  \r  \n   l   i
0000020   n   e   3       j   o   k   e   r       ^   M  \r  \n   l   i
0000040   n   e   4  \r  \n   l   i   n   e   5  \r  \n   l   i   n   e
0000060   6  \n   l   i   n   e   7  \n
0000070

$ grep --binary -v $'\r'$ dosfile
line6
line7
    
por 10.01.2018 / 21:38