Có cách nào để phát hiện byte rỗng (␀, NUL, \ 0) trong sed không?


15

Liên quan đến một câu hỏi khác , để phát hiện các tệp nhị phân một cách mờ nhạt, có cách nào để phát hiện ␀ byte sedkhông?


Trong GNU sed, có, nhưng lưu ý rằng trên nhiều thông báo, các tiện ích văn bản không có khả năng xử lý các byte rỗng.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


16

Thí dụ:

Chứng minh rằng tôi đang gửi một byte NUL, theo sau là một dòng mới:

$ echo -e \\0 | hexdump -C
00000000  00 0a                                             |..|
00000002

Bây giờ tôi thay đổi byte NUL thành !dấu chấm than:

$ echo -e \\0 | sed 's/\x00/!/' | hexdump -C
00000000  21 0a                                             |!.|

Vì vậy, mẹo được sử dụng \x00như NUL-byte.


3
Bạn có thể echo -ne \\0tránh một dòng mới.
l0b0

Thay thế hexdump -Cbằng uniname -bcepuđể xem nhân vật nào nó bỏ.
l0b0

6
Cần đề cập rằng đó \xlà một sedphần mở rộng không chuẩn , nhưng GNUsed cung cấp nó.
jw013

6
Nó cũng nên được đề cập, đó echo -elà một bashism . printftương thích hơn nhiều
jofel

7

Có, mô hình \x00khớp với byte null.

Thí dụ:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  

@ l0b0: Lý do, tại sao nó làm việc cho tôi, là tôi đã sử dụng zsh. Theo POSIX , nó thay thế \0bằng byte không. Sự thay thế này là không cần thiết ("sẽ được hỗ trợ") và thực tế bash không hỗ trợ trực tiếp. Đối với nó, bạn cần phải sử dụng echo -e. Tôi thay thế echobằng printfcâu trả lời có vẻ tương thích hơn ...
jofel
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.