grep
là một công cụ xử lý văn bản. Nó hy vọng đầu vào của họ là tập tin văn bản . Có vẻ như điều tương tự cũng xảy ra với tr
macOS (mặc dù tr
được cho là hỗ trợ các tệp nhị phân).
Máy tính lưu trữ dữ liệu dưới dạng chuỗi byte . Một văn bản là một chuỗi các ký tự. Có một số cách để mã hóa các ký tự dưới dạng byte, được gọi là mã hóa ký tự . Mã hóa ký tự chuẩn trên thực tế ở hầu hết các nơi trên thế giới, đặc biệt là trên OSX, là UTF-8 , là mã hóa cho bộ ký tự Unicode . Chỉ có 256 byte có thể, nhưng hơn một triệu ký tự Unicode có thể, vì vậy hầu hết các ký tự được mã hóa thành nhiều byte. UTF-8 là một mã hóa có độ dài thay đổi: tùy thuộc vào ký tự, nó có thể mất từ một đến bốn byte để mã hóa một ký tự. Một số chuỗi byte không đại diện cho bất kỳ ký tự nào trong UTF-8. Do đó, có các chuỗi byte không phải là tệp văn bản UTF-8 hợp lệ.
tr
đang phàn nàn vì nó gặp phải một chuỗi byte như vậy. Nó hy vọng sẽ thấy một tệp văn bản được mã hóa trong UTF-8, nhưng nó thấy dữ liệu nhị phân không hợp lệ UTF-8.
Tài liệu Microsoft Word không phải là tệp văn bản: đó là tài liệu xử lý văn bản. Các định dạng tài liệu xử lý văn bản không chỉ mã hóa văn bản mà còn định dạng, hình ảnh nhúng, v.v ... Định dạng Word, giống như hầu hết các định dạng xử lý văn bản, không phải là một tệp văn bản.
Bạn có thể hướng dẫn các công cụ xử lý văn bản hoạt động trên byte bằng cách thay đổi ngôn ngữ . Cụ thể, chọn miền địa phương của C C, có nghĩa là về cơ bản có nghĩa là không có gì lạ mắt. Trên dòng lệnh, bạn có thể chọn cài đặt ngôn ngữ với các biến môi trường .
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
Điều này sẽ không phát ra bất kỳ lỗi nào, nhưng nó sẽ không làm gì hữu ích vì target-file
đây vẫn là một tệp nhị phân không có khả năng chứa hầu hết các chuỗi tìm kiếm mà bạn sẽ chỉ định.
Ngẫu nhiên, tr '\r' '\n'
không phải là một lệnh rất hữu ích trừ khi bạn có các tệp văn bản còn sót lại từ Mac OS 9 trở lên. \r
(trả về vận chuyển) là dấu tách dòng mới trong Mac OS trước Mac OS X. Kể từ OSX, dấu tách dòng mới là \n
(nguồn cấp dữ liệu, tiêu chuẩn unix) và tệp văn bản không chứa trả về vận chuyển. Windows sử dụng chuỗi hai ký tự CR-LF để thể hiện các ngắt dòng; tr -d '\r'
sẽ chuyển đổi tệp văn bản Windows thành tệp văn bản Unix / Linux / OSX.
Vậy làm thế nào bạn có thể tìm kiếm trong một tài liệu Word từ dòng lệnh? Một .docx
tài liệu Word thực sự là một kho lưu trữ zip chứa nhiều file, những cái chính là trong XML .
unzip -l Position-Paper-Final-Version.docx
Mac OS X bao gồm tiện ích zipgrep để tìm kiếm bên trong các tệp zip.
zipgrep DeCSS Position-Paper-Final-Version.docx
Kết quả sẽ không dễ đọc vì các tệp XML ở định dạng docx chủ yếu bao gồm một dòng lớn. Nếu bạn muốn tìm kiếm bên trong văn bản chính của tài liệu, hãy giải nén tệp word/document.xml
từ kho lưu trữ. Lưu ý rằng ngoài văn bản tài liệu, tệp này chứa đánh dấu XML đại diện cho cấu trúc của tài liệu. Bạn có thể xoa bóp đánh dấu XML một chút sed
để chia nó thành các dòng có thể quản lý được.
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS