manter fora da quebra de linha

1

Eu tenho alguns arquivos com essa estrutura:

2015-03-25 17:08:17
sysUpTimeInstance 93474;^M
1.ValueforState=2500

Eu quero substituir a quebra de linha, e deixar a terceira linha com a segunda linha, quero dizer, a saída seria assim:

2015-03-25 17:08:17
sysUpTimeInstance 93474;1.ValueforState=2500

Eu tentei com sed:

sed 's/^M$//' myfile.dat > mynewfile.dat

Mas apenas removeu o símbolo ^ M

Alguma sugestão?

    
por user3658319 30.03.2015 / 16:31

5 respostas

3

2 pensamentos:

  1. com sed, para qualquer linha que termine com um retorno de carro, junte-se à próxima linha

    sed '/\r$/ {N; s/\r\n//} ' file
    
  2. com awk, defina o separador de registro para entrada e saída:

    awk -v RS='\r\n' -v ORS='' 1 file
    
por 30.03.2015 / 17:51
1

Assumindo que o que aparece como ^M em sua postagem é realmente um caractere de retorno de carro ( \r ), o seguinte deve fazer o trabalho:

perl -pe 's/\r\n//g'

Ele funcionará, não importa quantas linhas sua entrada contenha: todas as linhas terminadas em \r\n serão unidas à linha que segue.

    
por 30.03.2015 / 17:09
1

Algumas coisas podem estar acontecendo.

Se o ^M não for realmente o 2 charecters ^ e M , mas é o modo como alguns editores podem representar o caractere Carriage Return (CR). por exemplo. Meu editor do Emacs mostra isso como tal. Esse caractere faz parte do par de caracteres end-of-line no sistema de arquivos do Windows: um retorno de carro (valor hexadecimal 0x0D) + uma nova linha (valor hexadecimal 0x0A). O caractere de nova linha também é conhecido como um feed de linha. O sistema de arquivos Unix usa apenas o caractere New Line para finalizar uma linha. Para remover um retorno de carro indesejado no final de uma linha no estilo Unix, usando sed , você pode usar a seguinte expressão regular: Nota \x0D e \r ambos funcionam em sed . Nota: \r é uma forma abreviada de representar 0x0D .

sed '/\r$/{N; s/\r\n//}'  

Se ^M for realmente os dois caracteres ^ e M , o que pode acontecer, às vezes, quando um arquivo do Windows é convertido incorretamente em um arquivo do estilo Unix, você deve manipular ^ como especial regular -expressão de caracteres; você deve escape com uma barra invertida \ : Use este comando sed :

sed '/\^M$/{N; s/\^M\n//}'
    
por 30.03.2015 / 17:57
0

^ M me parece um arquivo DOS

Se ^ M é realmente ASCII 13 (0x09) e não ASCII 94 + 77 (0x5E + 0x4D) tente usar:

sed ':a;N;$!ba;s/^M\n//g' myfile.dat > mynewfile.dat
    
por 30.03.2015 / 17:04
0

Se são apenas três linhas e você quer sempre entrar na segunda e terceira linha, você pode usar isto:

sed -e '2N' -e 's/\r\n//'

o comando N adicionará a próxima linha (ou seja, a terceira) à segunda e, em seguida, a substituição removerá a quebra de linha.

    
por 30.03.2015 / 17:05