Substituindo LineFeed \ x0a por SED

2

Eu tenho que excluir muitos Linefeeds (Hex \ x0a) em um arquivo de log.

Eu apenas tenho sed para resolver o problema. É um pouco complicado eu sei ..

Você tem idéia de como resolver o problema?

Aqui está um exemplo de arquivo de texto: link

hexdump -C hexprob.txt
00000000 45 0a 69 0a 6e 0a 66 0a 61 0a |E.i.n.f.a.|

Eu uso o seguinte código para remover o 'E':

sed -r 's/\x45//g' hexprob.txt | hexdump -C

00000000 0a 69 0a 6e 0a 66 0a 61 0a |.i.n.f.a.|

Mas se eu quiser remover o '\ x0a', não funciona:

sed -r 's/\x0a//g' hexprob.txt | hexdump -C

00000000 45 0a 69 0a 6e 0a 66 0a 61 0a |E.i.n.f.a.|

Você sabe o que fazer? Eu só não sei porque eu não posso substituir ou excluí-lo da mesma forma como qualquer outro valor hexadecimal?

Muito obrigado! Fake4d

    
por Fake4d 02.06.2014 / 15:21

1 resposta

3

O utilitário sed é orientado pela linha. Uma linha é lida e colocada no espaço padrão (o espaço padrão não contém um \ n). As ações sed são aplicadas ao espaço padrão e a linha é então escrita, com um \ n anexado. É por isso que não está fazendo o que você espera.

Se você quiser remover todas as novas linhas em um arquivo, poderá fazer isso

sed ':a;N;$!ba;s/\n//g' file

Isso efetivamente percorre as linhas de leitura de arquivo e as anexa ao espaço de padrão até que a última linha seja alcançada quando todo o espaço de padrão é usado para remover os \ ns.

  • : a cria um marcador.
  • N lê a próxima linha no espaço paterno
  • $! se não a última linha ba ramifica para um
  • s // n // g substitui todas as / g ocorrências de \ n com nada.

Dependendo do tamanho do arquivo, isso pode não funcionar, pois pode haver limites para o tamanho do espaço do padrão. Geralmente, é mais portável usar tr para fazer isso

tr -d '\n' <file  
    
por 02.06.2014 / 15:39