2 pensamentos:
-
com sed, para qualquer linha que termine com um retorno de carro, junte-se à próxima linha
sed '/\r$/ {N; s/\r\n//} ' file
-
com awk, defina o separador de registro para entrada e saída:
awk -v RS='\r\n' -v ORS='' 1 file
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?
2 pensamentos:
com sed, para qualquer linha que termine com um retorno de carro, junte-se à próxima linha
sed '/\r$/ {N; s/\r\n//} ' file
com awk, defina o separador de registro para entrada e saída:
awk -v RS='\r\n' -v ORS='' 1 file
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.
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//}'
^ 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
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.