2010-04-09 36 views
9

Tôi đã cố gắng thực hiện thay thế sed trong tệp nhị phân tuy nhiên tôi bắt đầu tin rằng điều đó là không thể. Về cơ bản những gì tôi muốn làm là tương tự như sau:thay thế sed nhị phân

sed -bi "s/\(\xFF\xD8[[:xdigit:]]\{1,\}\xFF\xD9\)/\1/" file.jpg 

Logic tôi muốn đạt được là: quét qua một tập tin nhị phân cho đến khi mã hex FFD8, tiếp tục đọc cho đến khi FFD9, và chỉ lưu những gì là giữa chúng (loại bỏ rác trước và sau, nhưng bao gồm FFD8FFD9 là phần đã lưu của tệp)

Có cách nào tốt để làm điều này không? Ngay cả khi không sử dụng sed?

EDIT: Tôi chỉ đang chơi xung quanh và tìm thấy cách sạch nhất để làm điều đó IMO. Tôi biết rằng tuyên bố grep này sẽ hành động tham lam.

hexdump -ve '1/1 "%.2x"' dirty.jpg | grep -o "ffd8.*ffd9" | xxd -r -p > clean.jpg 
+0

Luôn coi chừng các kết quả trùng khớp sai khi grepping cho các mẫu về dữ liệu cơ bản ngẫu nhiên, chẳng hạn như luồng nhị phân nén! – dwarring

+0

@snoopy - (1) có giải pháp tốt hơn không? (2) nếu không, cần phải làm gì để cải thiện điều này? Ngừng tìm kiếm khi một số "cuối siêu dữ liệu" được truy cập? – DVK

+0

Phụ thuộc chính xác những gì bạn đang làm nhưng mô-đun CPAN Image :: EXIF ​​cho phép bạn trích xuất và thay đổi siêu dữ liệu. Có thể sử dụng ở đây. – dwarring

Trả lời

6

bbe là "sed cho tệp nhị phân" và sẽ hoạt động hiệu quả hơn đối với tệp nhị phân lớn hơn hexdumping/reconstructing.

Một ví dụ về việc sử dụng nó:

$ bbe -e 's/original/replaced/' infile > outfile 

Thông tin thêm về các man page.

1

sed có thể thực hiện, nhưng có thể khó khăn. Dưới đây là một kịch bản Python rằng làm điều tương tự (lưu ý rằng nó chỉnh sửa các tập tin tại chỗ, đó là những gì tôi giả sử bạn muốn làm dựa trên kịch bản sed của bạn):

import re 

f = open('file.jpeg', 'rb+') 
data = f.read() 
match = re.search('(\xff\xd8[0-9A-fa-f]+)\xff\xd9', data) 
if match: 
    result = match.group(1) 
    f.seek(0) 
    f.write(result) 
    f.truncate() 
else: 
    print 'No match' 
f.close() 
3

Is there a good way to do this

có của Tất nhiên, sử dụng một công cụ chỉnh sửa hình ảnh chẳng hạn như công cụ từ ImageMagick (tìm kiếm trên mạng cho linux jpeg, exif editor, v.v.) để biết cách chỉnh sửa siêu dữ liệu jpg. Tôi chắc chắn bạn có thể tìm thấy một công cụ phù hợp với bạn. Đừng cố gắng làm điều này một cách khó khăn. :)

+0

đồng ý, đây là cơ bản dữ liệu nhị phân ngẫu nhiên, do đó bạn đã có một 1/(2 ** 16) nhận được một dương tính giả khi tìm kiếm bất kỳ chuỗi 2 byte. Đó là khoảng một lần mỗi 65 nghìn dữ liệu. – dwarring

+0

exiftool (http://search.cpan.org/dist/Image-ExifTool/exiftool) là ứng dụng sát thủ cho siêu dữ liệu đa phương tiện. – daxim

+0

Chỉ sao chép nhận xét ở trên của tôi xuống đây: FYI, mục đích của câu hỏi này là để thực hiện chỉnh sửa tệp thủ công trong kịch bản RAID 5. Khi lấy sọc và khối bạn sẽ nhận được dữ liệu trước và sau jpg (hoặc bất kỳ tệp nào khác). Điều này có nghĩa là để làm sạch nó. – Ryan

1

Ngoài ra, Perl này có thể làm việc (không kiểm tra, caveat emptor) ... nếu Python không được cài đặt :)

open(FILE, "file.jpg") || die "no open $!\n"; 
while (read(FILE, $buff, 8 * 2**10)) { 
    $content .= $buff; 
} 
@matches = ($content =~ /(\xFF\xD8[:xdigit:]+?\xFF\xD9)/g; 
print STDOUT join("", @matches); 

Bạn cần phải thêm binmode(FILE); binmode(STDOUT); trên DOS hoặc VMS sau open() gọi - không cần thiết trên Unix.

+0

xin lỗi DVK - đó là tôi. Tôi đã bị cắn bởi lỗi bản thân mình khi cố gắng grep cho các mẫu ngắn trong dữ liệu nhị phân. Chỉ cần nghĩ rằng có một cơ hội tốt cho sự không phù hợp này, hoặc là trên một hoặc các neo khác hoặc hoàn toàn chọn một 'mô hình ảo' ngẫu nhiên. Tôi chỉ nghĩ rằng Sớm hay muộn OP có thể kết thúc với jpeg kỳ quặc và tự hỏi tại sao! Cũng downvoted những người khác cho cùng một lý do. – dwarring

+1

Nếu bạn đang nói rằng OP có một vấn đề XY, xin vui lòng trình bày một giải pháp tốt hơn so với một regex trước khi tải về các giải pháp regex là "xấu". Nếu câu trả lời này có lỗi, hãy chỉ ra nó. Nếu có một mẫu cụ thể trong đó phương pháp tiếp cận regexp sẽ thất bại, vui lòng làm rõ rằng câu trả lời (một lần nữa XY) – DVK

+1

Ngoài ra, xin lưu ý rằng giải pháp này KHÔNG thay đổi tệp jpg. Chỉ các kết quả đầu ra được tìm thấy chuỗi (mà tôi đoán có thể là siêu dữ liệu) để tiêu chuẩn ra cho chuyển hướng/tiêu thụ sau này – DVK

Các vấn đề liên quan