47 votes

Comment utiliser sed pour supprimer les octets nuls ?

Qu'est-ce que la sed incantation pour supprimer les octets nuls d'un fichier ? J'essaie :

s/\000//g

mais cela revient à supprimer les chaînes de zéros.

s/\x00//g

ne semble pas avoir d'effet. J'essaie de faire cela dans un sed script, donc je ne suis pas sûr que la echo fonctionnera.

58voto

Tamara Wijsman Points 56163

Je ne sais pas comment on peut y parvenir avec sed mais il s'agit d'une solution qui fonctionne avec tr :

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

Il s'agit d'une solution pour sed qui fonctionne avec certaines (mais pas toutes) implémentations de sed :

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

Il s'agit d'une solution qui consiste à remplacer les caractères par des espaces, ce qui devrait fonctionner dans tous les cas :

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

8voto

kqw Points 2451

tr a trébuché sur d'autres octets dans mon fichier et a sed n'a rien remplacé. J'ai fini par le faire non pas en sed mais en Python :

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

Voici une canalisable un seul mot :

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

J'ai également remarqué que certaines commandes laissaient les octets nuls mais qu'ils n'étaient plus visibles, du moins pas dans un terminal OSX. J'ai utilisé hexdump pour déboguer ce problème.

4voto

Flimm Points 9047

Il est assez facile d'utiliser Perl pour effectuer une expression rationnelle. Il suffit de remplacer sed con perl -np -e :

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

Avec la -n les expressions rationnelles sont exécutées ligne par ligne, comme dans sed.

Si vous souhaitez utiliser des octets de zéro comme séparateurs d'enregistrements, utilisez la fonction Perl -0 opción.

$ 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

Vous pouvez consulter les options de la ligne de commande de Perl en exécutant la commande perldoc perlrun .

1voto

Big Daddy Points 11

Pour faire correspondre un octet nul, j'utilise cette expression rationnelle avec le SED de Cygwin :

[^ \x01 - \x7F ]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X