Как использовать 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.