Como usar sed para remover bytes nulos?

37

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

s/\000//g

mas isso está eliminando seqüências de zeros.

s/\x00//g

parece não ter efeito. Estou tentando fazer isso em um sedscript, então não tenho certeza se o echotruque funcionará.

Chris Curvey
fonte

Respostas:

40

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

tr < file-with-nulls -d '\000' > file-without-nulls

Esta é uma solução sedque 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 no espaço que deve funcionar em todas as ocasiões:

sed 's/\x0/ /g' file1 > file2
Tamara Wijsman
fonte
10
isso parece uma resposta muito incompleta. por que funcionaria em algumas ocasiões e não em outras? Se sim, então um exemplo não seria útil?
barlop
@ Barlop: Por causa da maneira como é implementada? O OP não especificou um e eu não vou enumerar cada aplicação ...
Tamara Wijsman
4
Bem, isso soa bem para mim, então você está dizendo que depende da implementação do SED. Se você não tivesse dito que teria deixado em aberto a sugestão possível de que uma implementação do SED possa remover nulos de um arquivo e não de outro arquivo, dependendo dos dados no arquivo.
barlop
3
não deveria ser "tr -d '\ 000' <arquivo com nulos> arquivo sem nulos"?
Seamus Abshere
11
Funciona para mim ™. Também é útil: -iparâmetro para converter o arquivo no local.
Zbyszek 19/04
8

trtropeçou em alguns outros bytes no meu arquivo e sednão substituiu nada. Acabei fazendo isso não sedem Python:

f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("\0", '')

Aqui está um liner de uma linha:

python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("\0", ""))'

Também notei que alguns comandos deixam os bytes nulos ali, mas não estão mais visíveis, pelo menos não em um terminal OSX. Eu costumava hexdumpdepurar isso.

fifi finanças
fonte
3

É muito fácil usar o Perl para executar uma regex. Basta substituir sedpor perl -np -e:

$ printf 'one\0two\0' | perl -np -e 's/\0/\n/g'
one
two

Com a -nopção, as expressões regulares são executadas linha por linha, assim como sed.

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

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

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

Flimm
fonte
1

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

[^ \ x01- \ x7F]

Paizão
fonte
Esta é a resposta para a pergunta do sed no GNUWin32. Na verdade, remove mais do que apenas nulos. Pode ou não funcionar para você, dependendo do que você deseja corresponder e da implementação do sed.
precisa saber é o seguinte