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á.

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

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.


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.


1

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

[^ \ x01- \ x7F]


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.