Bagaimana cara menggunakan sed untuk menghapus byte nol?

37

Apa sedmantera untuk menghapus byte nol dari file? Saya mencoba:

s/\000//g

tapi itu melucuti string nol.

s/\x00//g

tampaknya tidak berpengaruh. Saya mencoba melakukan ini dalam sebuah sedskrip, jadi saya tidak yakin echotriknya akan berhasil.

Chris Curvey
sumber

Jawaban:

40

Saya tidak tahu bagaimana Anda dapat mencapai ini dengan tepat sed, tetapi ini adalah solusi yang bekerja dengan tr:

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

Ini adalah solusi untuk sedyang berfungsi dalam beberapa kesempatan tetapi tidak semua:

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

Ini adalah solusi yang melibatkan penggantian karakter ruang yang harus bekerja di semua kesempatan:

sed 's/\x0/ /g' file1 > file2
Tamara Wijsman
sumber
10
sepertinya jawaban yang sangat tidak lengkap. mengapa itu akan bekerja pada beberapa kesempatan dan bukan pada yang lain, dan jika demikian maka sebuah contoh tidak akan berguna?
barlop
@barlop: Karena cara penerapannya? OP tidak menentukan satu dan saya tidak akan menyebutkan setiap implementasi tunggal ...
Tamara Wijsman
4
Nah itu kedengarannya baik bagi saya, jadi Anda mengatakan itu tergantung pada implementasi SED. Jika Anda belum mengatakan bahwa Anda akan tetap membuka kemungkinan saran bahwa satu implementasi SED dapat menghapus nulls dari satu file dan bukan file lain, tergantung pada data dalam file tersebut.
barlop
3
bukankah seharusnya "tr -d '\ 000' <file-dengan-nulls> file-tanpa-nulls"?
Seamus Abshere
1
Bekerja untuk saya ™. Juga berguna: -iparameter untuk mengonversi file di tempat.
zbyszek
8

trtersandung beberapa byte lain di file saya dan sedtidak mengganti apa pun. Saya akhirnya melakukannya bukan seddengan Python:

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

Berikut ini adalah satu lapis pipa :

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

Saya juga melihat beberapa perintah sebenarnya meninggalkan byte nol di sana tetapi mereka tidak terlihat lagi, setidaknya tidak di terminal OSX. Saya menggunakan hexdumpdebug ini.

keuangan fifi
sumber
3

Sangat mudah untuk menggunakan Perl untuk melakukan regex. Cukup ganti seddengan perl -np -e:

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

Dengan -nopsi, regex dijalankan baris demi baris, sama seperti sed.

Jika Anda ingin menggunakan nol byte sebagai pemisah rekaman, gunakan -0opsi 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

Anda dapat mencari opsi baris perintah dari Perl dengan menjalankan perldoc perlrun.

Flimm
sumber
1

Untuk mencocokkan byte nol, saya menggunakan regex ini dengan SED Cygwin:

[^ \ x01- \ x7F]

Ayah Besar
sumber
Ini adalah jawaban untuk pertanyaan sed pada GNUWin32. Ini sebenarnya menghapus lebih dari sekadar nol. Ini mungkin atau mungkin tidak bekerja untuk Anda tergantung pada apa yang ingin Anda cocokkan, dan penerapan sed.
Itsme2003