Как использовать sed для удаления нулевых байтов?

37

Что такое sedзаклинание удалить нулевые байты из файла? Я пытаюсь:

s/\000//g

но это убирает нули.

s/\x00//g

кажется, не имеет никакого эффекта. Я пытаюсь сделать это в sedсценарии, поэтому я не уверен, что echoтрюк сработает.

Крис Керви
источник

Ответы:

40

Я не знаю, как вы можете достичь этого с помощью sed, но это решение, которое работает с tr:

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

Это решение, sedкоторое работает в некоторых случаях, но не во всех:

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

Это решение, которое включает замену на пробелы, которые должны работать во всех случаях:

sed 's/\x0/ /g' file1 > file2
Тамара Вийсман
источник
10
это выглядит как очень неполный ответ. почему это сработало бы в некоторых случаях, а не в других, и если это так, то пример не будет полезным?
Барлоп
@barlop: Из-за того, как это реализовано? ОП не указал ни одного, и я не собираюсь перечислять каждую реализацию ...
Тамара Вийсман
4
Ну, тогда это звучит хорошо для меня, так что вы говорите, что это зависит от реализации SED. Если бы вы не сказали, что оставили бы открытым, возможное предложение о том, что одна реализация SED может удалять пустые значения из одного файла, а не из другого файла, в зависимости от данных в файле.
Барлоп
3
это не должно быть "tr -d '\ 000' <файл-с-нулями> файл-без-нулями"?
Симус Абшер
1
Работает на меня ™. Также полезно: -iпараметр для преобразования файла на место.
zbyszek
8

trопрокинул некоторые другие байты в моем файле и sedничего не заменил. Я сделал это не sedв Python:

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

Вот трубный однострочник:

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

Я также заметил, что некоторые команды фактически оставляют там нулевые байты, но они больше не видны, по крайней мере, в терминале OSX. Я использовал hexdumpдля отладки этого.

фифи финанс
источник
3

Использовать Perl для выполнения регулярных выражений довольно просто. Просто замените sedна perl -np -e:

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

С -nопцией, регулярные выражения запускаются строка за строкой, как sed.

Если вы хотите использовать нулевые байты в качестве разделителей записей, используйте параметр Perl -0.

$ 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

Вы можете посмотреть параметры командной строки Perl, запустив perldoc perlrun.

Флимм
источник
1

Чтобы соответствовать нулевому байту, я использую это регулярное выражение с SED Cygwin:

[^ \ X01- \ x7F]

Большой папа
источник
Это ответ на вопрос для sed на GNUWin32. Это фактически удаляет больше, чем просто нули. Это может или не может работать для вас в зависимости от того, что вы хотите соответствовать, и реализации sed.
Itsme2003