shell script / Utility thay thế 2 byte unicode trong tệp nhị phân


7

Tôi có nhiều tệp Unicode lớn. Tôi muốn thay thế từng cặp byte Unicode bằng một cặp byte Unicode mới. Ví dụ: tệp gốc chứa "C3 B9 C3 AB C3 B8 C3 B0" và tôi muốn thay thế tệp này bằng "D7 A0 D7 A8 D7 9B D7 A9". Tôi sẽ cần thay thế mọi "C3 B9" bằng "D7 A0" trong toàn bộ tệp. Sẽ có khoảng 30 giá trị "C3 XX" khác nhau được thay thế bằng các giá trị "D7 YY". Tôi sẽ cần một bảng để lặp qua cho mỗi thay thế.

Lý tưởng nhất điều này sẽ thay thế tệp gốc nhưng nó cũng có thể tạo một tệp đầu ra mới.

Có tiện ích nào chạy trên Ubuntu sẽ thực hiện công việc này không?


Tôi không thể giúp đỡ trực tiếp, nhưng mọi người báo cáo bằng python xử lý Unicode cho loại điều này.
EightBitTony

1
Có phải Unicode được mã hóa dưới dạng UTF-8 (ví dụ: C3B9 là U + 00F9 LATIN NHỎ LETTER U VỚI GRAVE (ù))? Hoặc như UCS-2 (ví dụ: C3B9 là HANGUL SYLLABLE SSYEOT)?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


3

Điều đó có thể với perl,

Một tệp mẫu:

echo -e "\xe8\x90" > a

Và bây giờ nếu bạn làm:

perl -pne 's/\xe8\x90/\x41\x42/g' < a > output

Bạn nhận được 0x41 0x42, đó làAB


Làm thế nào để tôi làm cho nó hoạt động trên các dòng? Tôi đang cố gắng thực thi không quá một dòng mới sau một {, vì vậy tôi đã thử perl -pne "s/\x7b\x0a\x0a/\x7b\x0a/g" < a > outputvà nó không hoạt động. Tôi đã thử nghiệm perl -pne "s/\x7b\x0a/\x7b/g" < a > outputloại bỏ \x0aký tự dòng mới, nhưng nó không thực hiện ở nơi không nên và tôi chỉ muốn nó loại bỏ \x0aký tự dấu khi có một chuỗi\x7b\x0a\x0a
Aaron Franke

2

Một thay thế cho cuộc gọi perl là sử dụng sed

sed -i.bckp -e "s/\xc3\xb9/\xd7\xa0/" file

Sử dụng trình soạn thảo luồng (sed) Tôi có nó thực hiện tại chỗ (nghĩa là nó sẽ sửa đổi hoàn toàn tệp) và tôi đã cung cấp .bckp làm đối số cho -i để tệp cũ sẽ được sao lưu. Sau đó, tôi chạy một biểu thức hoán đổi tìm kiếm các byte hex của bạn bằng regex và hoán đổi nó với các byte bạn muốn sử dụng. Và cuộc gọi đến tập tin là tập tin lớn mà bạn muốn làm điều này với.

Nếu bạn muốn thay thế tại chỗ mà không cần sao lưu (ví dụ: tệp nằm trong repo), thì bạn chỉ có thể xóa .bckp sau -i và nó sẽ không tạo bất kỳ tệp mới nào.


Làm cách nào để tôi sedsửa đổi các ký tự dòng mới ( \x0a)? Lệnh sed -i -e "s/\x0a//g" filekhông làm gì cả. Nếu tôi sử dụng nghĩa đen bất kỳ nhân vật nào khác ngoài \x0anó hoạt động tốt.
Aaron Franke

thay vào đó, hãy thử sử dụng "s / \ n // g" (xem phần Reg Expression trong Manpage). nếu điều đó không hoạt động, hãy xác nhận giá trị hex (tùy thuộc vào HĐH, đó có thể là trả lại vận chuyển thay vì dòng mới) có trong tệp.
sparticvs

Tôi đã tìm ra giải pháp là sử dụng sed -z, vì điều này gây ra sedviệc phân định các dòng bằng ký tự null thay vì ký tự dòng mới, vì vậy toàn bộ tệp được coi là một dòng lớn và do đó tôi có thể sedchỉnh sửa các ký tự dòng mới.
Aaron Franke
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.