Який sed
заклик видалити нульові байти з файлу? Я намагаюсь:
s/\000//g
але це викреслення рядків нулів.
s/\x00//g
схоже, ніякого ефекту. Я намагаюся зробити це за sed
сценарієм, тому не впевнений, що echo
фокус спрацює.
Який sed
заклик видалити нульові байти з файлу? Я намагаюсь:
s/\000//g
але це викреслення рядків нулів.
s/\x00//g
схоже, ніякого ефекту. Я намагаюся зробити це за sed
сценарієм, тому не впевнений, що echo
фокус спрацює.
Відповіді:
Я не знаю, як саме можна досягти цього sed
, але це рішення, яке працює з tr
:
tr < file-with-nulls -d '\000' > file-without-nulls
Це рішення, sed
яке працює в деяких випадках, але не у всіх:
sed 's/\x0//g' file1 > file2
Це рішення, яке передбачає заміну символів у космос, які повинні працювати у будь-яких випадках:
sed 's/\x0/ /g' file1 > file2
-i
параметр для перетворення файлу на місце.
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
налагоджував це.
Використовувати Perl досить просто для виконання регулярних виразів. Просто замініть sed
на perl -np -e
:
$ printf 'one\0two\0' | perl -np -e 's/\0/\n/g'
one
two
За допомогою -n
параметра, регулярні вирази запускаються по черзі, як і sed.
Якщо ви хочете використовувати нульові байти як роздільники записів, використовуйте -0
параметр 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
Ви можете переглянути параметри командного рядка Perl, запустивши perldoc perlrun
.
Щоб відповідати нульовому байту, я використовую цей регулярний вираз із SED Cygwin:
[^ \ x01- \ x7F]