Como usar o sed para remover bytes nulos?

35

Qual é o sed de encantamento para remover bytes nulos de um arquivo? Estou tentando:

s/
s/\x00//g
0//g

mas isso está excluindo cadeias de zeros.

s/
s/\x00//g
0//g

parece não ter efeito. Estou tentando fazer isso em um script sed , então não tenho certeza se o truque echo funcionará.

    
por Chris Curvey 24.05.2011 / 18:21

4 respostas

36

Eu não sei exatamente como você pode conseguir isso com sed , mas essa é uma solução que funciona com tr :

tr < file-with-nulls -d '
sed 's/\x0//g' file1 > file2
0' > file-without-nulls

Esta é uma solução para sed que funciona em algumas ocasiões, mas não em todas:

sed 's/\x0/ /g' file1 > file2

Esta é uma solução que envolve a substituição de caracteres de espaço, o que deve funcionar em todas as ocasiões:

tr < file-with-nulls -d '
sed 's/\x0//g' file1 > file2
0' > file-without-nulls
    
por 24.05.2011 / 18:25
8

tr tropeçou em alguns outros bytes no meu arquivo e sed não substituiu nada. Acabei fazendo isso não em sed , mas em Python:

f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("
python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("
f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("
python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("%pre%", ""))'
", '')
", ""))'
", '')

Aqui está um one-liner pipeable :

%pre%

Eu também notei que alguns comandos realmente deixam os bytes nulos lá, mas eles não são mais visíveis, pelo menos não em um terminal OSX. Eu usei hexdump para depurar isso.

    
por 25.10.2012 / 14:51
3

É muito fácil usar o Perl para executar um regex. Basta substituir sed por perl -np -e :

$ printf 'one
$ printf 'one
$ printf 'one
$ printf 'one%pre%two%pre%' | perl -np0 -e 's/^/prefix /; s/%pre%/\n/g'
prefix one
prefix two
$ printf 'one%pre%two%pre%' | perl -np -e 's/^/prefix /; s/%pre%/\n/g'
prefix one
two
two%pre%' | perl -np -e 's/%pre%/\n/g' one two
two%pre%' | perl -np0 -e 's/^/prefix /; s/%pre%/\n/g' prefix one prefix two $ printf 'one%pre%two%pre%' | perl -np -e 's/^/prefix /; s/%pre%/\n/g' prefix one two
two%pre%' | perl -np -e 's/%pre%/\n/g' one two

Com a opção -n , os regexes são executados linha por linha, como sed.

Se você quiser usar zero bytes como separadores de registros, use a opção -0 do Perl.

%pre%

Você pode procurar as opções de linha de comando do Perl executando perldoc perlrun .

    
por 14.02.2014 / 12:25
1

Para corresponder a um byte nulo, eu uso esta regex com o SED do Cygwin:

[^\x01-\x7F]

    
por 16.01.2014 / 02:53

Tags