Làm thế nào để sử dụng sed để loại bỏ byte null?


37

Câu sedthần chú để loại bỏ byte rỗng từ một tập tin là gì? Tôi đang cô:

s/\000//g

nhưng đó là tước chuỗi số không.

s/\x00//g

dường như không có tác dụng Tôi đang cố gắng thực hiện điều này trong một sedkịch bản, vì vậy tôi không chắc echothủ thuật này sẽ hoạt động.

Câu trả lời:


40

Tôi không biết làm thế nào bạn có thể đạt được điều này một cách chính xác sed, nhưng đây là một giải pháp hoạt động với tr:

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

Đây là một giải pháp cho sedcông việc đó trong một số trường hợp nhưng không phải tất cả:

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

Đây là một giải pháp liên quan đến việc thay thế thành các ký tự không gian sẽ hoạt động trong tất cả các trường hợp:

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

10
Có vẻ như một câu trả lời rất không đầy đủ. Tại sao nó sẽ hoạt động trong một số trường hợp mà không phải là những dịp khác, và nếu vậy thì một ví dụ sẽ không hữu ích?
barlop

@barlop: Vì cách nó được thực hiện? OP đã không chỉ định một và tôi sẽ không liệt kê mỗi lần thực hiện ...
Tamara Wijsman

4
Chà điều đó nghe có vẻ tốt đối với tôi, vì vậy bạn đang nói nó phụ thuộc vào việc triển khai SED. Nếu bạn đã nói rằng bạn đã bỏ ngỏ đề xuất có thể rằng một triển khai SED có thể xóa null khỏi một tệp chứ không phải tệp khác, tùy thuộc vào dữ liệu trong tệp.
barlop

3
không nên là "tr -d '\ 000' <file-with-nulls> file-without-nulls"?
Seamus abshere

1
Hoạt động cho tôi ™. Cũng hữu ích: -itham số để chuyển đổi tập tin tại chỗ.
zbyszek

8

trvấp phải một số byte khác trong tệp của tôi và sedkhông thay thế bất cứ điều gì. Cuối cùng tôi đã làm nó không phải trong sednhưng trong Python:

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

Đây là một lớp lót dễ uốn :

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

Tôi cũng nhận thấy một số lệnh thực sự để lại các byte rỗng ở đó nhưng chúng không còn hiển thị nữa, ít nhất là không có trong một thiết bị đầu cuối OSX. Tôi đã sử dụng hexdumpđể gỡ lỗi này.


3

Thật dễ dàng để sử dụng Perl để thực hiện regex. Chỉ cần thay thế sedbằng perl -np -e:

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

Với -ntùy chọn, regexes được chạy theo từng dòng, giống như sed.

Nếu bạn muốn sử dụng byte bằng 0 làm dấu tách bản ghi, hãy sử dụng -0tùy chọn của 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

Bạn có thể tra cứu các tùy chọn dòng lệnh của Perl bằng cách chạy perldoc perlrun.


1

Để khớp với byte rỗng, tôi sử dụng biểu thức chính này với SED của Cygwin:

[^ \ x01- \ x7F]


Đây là câu trả lời cho câu hỏi dành cho sed trên GNUWin32. Nó thực sự loại bỏ nhiều hơn chỉ là null. Nó có thể hoặc không thể làm việc cho bạn tùy thuộc vào những gì bạn muốn phù hợp và việc thực hiện sed.
Itsme2003
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.