31

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

s/\000//g

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

s/\x00//g

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

4 ответа4

33

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

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

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

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

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

sed 's/\x0/ /g' file1 > file2
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]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .