Як використовувати 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 '<файл-з-нулями> файл-без-нулів "?
Seamus Abshere

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.

Якщо ви хочете використовувати нульові байти як роздільники записів, використовуйте -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.


1

Щоб відповідати нульовому байту, я використовую цей регулярний вираз із SED Cygwin:

[^ \ x01- \ x7F]


Це відповідь на питання щодо sed на GNUWin32. Це насправді викреслює більше, ніж просто нулі. Це може чи не може працювати для вас залежно від того, що ви хочете відповідати, та впровадження sed.
Itsme2003,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.