Comment utiliser sed pour supprimer les octets nuls?

37

Quelle est l' sedincantation pour supprimer les octets nuls d'un fichier? J'essaie:

s/\000//g

mais cela enlève des chaînes de zéros.

s/\x00//g

semble n'avoir aucun effet. J'essaie de le faire dans un sedscript, donc je ne suis pas sûr que l' echoastuce fonctionnera.

Chris Curvey
la source

Réponses:

40

Je ne sais pas comment vous pouvez exactement y parvenir sed, mais c'est une solution qui fonctionne avec tr:

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

C'est une solution sedqui fonctionne dans certaines occasions mais pas toutes:

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

Il s'agit d'une solution qui consiste à remplacer dans l'espace des caractères qui devraient fonctionner en toutes occasions:

sed 's/\x0/ /g' file1 > file2
Tamara Wijsman
la source
10
cela ressemble à une réponse très incomplète. pourquoi cela fonctionnerait-il à certaines occasions et pas à d'autres, et dans l'affirmative, un exemple ne serait-il pas utile?
barlop
@barlop: En raison de la façon dont il est mis en œuvre? L'OP n'en a pas spécifié une et je ne vais pas énumérer chaque implémentation ...
Tamara Wijsman
4
Eh bien, cela me semble bien, alors vous dites que cela dépend de la mise en œuvre de SED. Si vous n'aviez pas dit que vous auriez laissé ouverte la suggestion possible qu'une implémentation de SED puisse supprimer les valeurs nulles d'un fichier et non d'un autre fichier, selon les données du fichier.
barlop
3
ne devrait-il pas s'agir de "tr -d '\ 000' <fichier-avec-nulls> fichier-sans-nulls"?
Seamus Abshere
1
Fonctionne pour moi ™. Également utile: -iparamètre pour convertir le fichier sur place.
zbyszek
8

trdéclenché sur certains autres octets dans mon fichier et sedn'a rien remplacé. J'ai fini par le faire non pas seden Python mais:

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

Voici une doublure canalisable :

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

J'ai également remarqué que certaines commandes laissent en fait les octets nuls, mais elles ne sont plus visibles, du moins pas dans un terminal OSX. J'avais l'habitude hexdumpde déboguer cela.

fifi finance
la source
3

Il est assez facile d'utiliser Perl pour effectuer une expression régulière. Remplacez simplement sedpar perl -np -e:

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

Avec l' -noption, les expressions régulières sont exécutées ligne par ligne, tout comme sed.

Si vous souhaitez utiliser zéro octet comme séparateurs d'enregistrements, utilisez l' -0option 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

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

Flimm
la source
1

Pour faire correspondre un octet nul, j'utilise cette expression régulière avec le SED de Cygwin:

[^ \ x01- \ x7F]

Grand papa
la source
C'est la réponse à la question de sed sur GNUWin32. Il supprime en fait plus que de simples valeurs nulles. Cela peut ou peut ne pas fonctionner pour vous en fonction de ce que vous voulez faire correspondre et de la mise en œuvre de sed.
Itsme2003