sed escapou charcter não correspondendo em arquivo grande

2

Eu tenho um arquivo xml grande (~ 180MB) com alguns caracteres errados, por exemplo

<Data ss:Type="String">7402953^@</Data>

A parte ^@ deve ser removida. O trabalho deveria ser feito com

sed -i 's/\^@//g' /tmp/large.xml

mas, por alguma razão desconhecida, não funciona como esperado se a string estiver localizada no meu arquivo xml grande. Se o arquivo tiver apenas alguns KB de tamanho, sed funcionará perfeitamente.

Parece um bug, mas acho que não pode ser porque a tarefa é bastante óbvia. Estou fazendo algo errado?

    
por dMedia 08.05.2018 / 22:38

2 respostas

5

A julgar pela sua pergunta (porque não há exemplos), eu diria que ^@ no arquivo grande não são realmente os dois caracteres ( ^ e @ ), mas um desses caracteres não imprimíveis. / p>

Você pode inserir esse caractere não imprimível no terminal com Ctrl + v + Ctrl + 2 .
Use isso em sed em vez dos caracteres ^ e @ e tudo ficará bem.

Remova também a sequência de escape porque ela não é necessária para o caractere não imprimível.

    
por 08.05.2018 / 22:54
0

awk

Se uma solução usando awk for aceitável, isso removerá todos os caracteres não imprimíveis.

Isto funciona no GNU awk (Linux) e no BSD awk (Mac).

awk '{ gsub(/[^[:print:][:blank:]]/,"",$0) ; print $0 }' input.xml > output.xml
  • gsub(/[^[:print:][:blank:]]/,"",$0)
    De cada linha de entrada, remova todos os caracteres indesejados.
    • [:print:]
      Qualquer caractere imprimível.
    • [:blank:]
      Espaço ou tabulação.
    • [^[:print:][:blank:]]
      Qualquer caractere não incluído nessas duas classes.
  • print $0
    Imprima cada linha de entrada.
  • > output.xml
    Salve a saída em um arquivo em vez de imprimi-lo na tela.

Faça o mesmo com menos pressionamentos de tecla (é um pouco difícil de ler):

awk '{gsub(/[^[:print:][:blank:]]/,"")}1' input.xml > output.xml
  • Você não precisa especificar ,$0 (a linha inteira de entrada) em gsub se estiver examinando toda a linha.
  • O 1 no final significa "agora faça a ação padrão (ou seja, imprimir) para cada linha".
por 09.05.2018 / 06:22