grep
adalah alat pengolah teks. Itu mengharapkan input mereka menjadi file teks . Tampaknya hal yang sama berlaku untuk tr
macOS (meskipun tr
seharusnya mendukung file biner).
Komputer menyimpan data sebagai urutan byte . Teks adalah urutan karakter. Ada beberapa cara untuk menyandikan karakter sebagai byte, yang disebut penyandian karakter . Pengkodean karakter standar de facto di sebagian besar dunia, terutama pada OSX, adalah UTF-8 , yang merupakan pengkodean untuk rangkaian karakter Unicode . Hanya ada 256 byte yang mungkin, tetapi lebih dari satu juta karakter Unicode yang mungkin, sehingga sebagian besar karakter dikodekan sebagai beberapa byte. UTF-8 adalah pengodean panjang variabel: tergantung pada karakter, dapat diperlukan satu hingga empat byte untuk menyandikan karakter. Beberapa urutan byte tidak mewakili karakter apa pun di UTF-8. Oleh karena itu, ada urutan byte yang bukan file teks UTF-8 yang valid.
tr
mengeluh karena mengalami urutan byte tersebut. Ia mengharapkan untuk melihat file teks yang dikodekan dalam UTF-8, tetapi ia melihat data biner yang tidak valid UTF-8.
Dokumen Microsoft Word bukan file teks: dokumen pengolah kata. Format dokumen pengolah kata tidak hanya mengkode teks, tetapi juga format, gambar yang disematkan, dll. Format Word, seperti kebanyakan format pengolah kata, bukan file teks.
Anda dapat menginstruksikan alat pengolah teks untuk beroperasi pada byte dengan mengubah lokal . Secara khusus, pilih "C" lokal, yang pada dasarnya berarti "tidak ada yang mewah". Pada baris perintah, Anda dapat memilih pengaturan lokal dengan variabel lingkungan .
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
Ini tidak akan memunculkan kesalahan apa pun, tetapi tidak akan melakukan apa pun yang berguna karena target-file
masih merupakan file biner yang tidak mungkin berisi sebagian besar string pencarian yang akan Anda tentukan.
Secara kebetulan, tr '\r' '\n'
ini bukan perintah yang sangat berguna kecuali Anda memiliki file teks yang tersisa dari Mac OS 9 atau lebih lama. \r
(carriage return) adalah pemisah baris baru di Mac OS sebelum Mac OS X. Sejak OSX, pemisah baris baru adalah \n
(baris feed, standar unix) dan file teks tidak mengandung carriage return. Windows menggunakan urutan dua karakter CR-LF untuk mewakili jeda baris; tr -d '\r'
akan mengkonversi file teks Windows menjadi file teks Unix / Linux / OSX.
Jadi bagaimana Anda bisa mencari dalam dokumen Word dari baris perintah? Sebuah .docx
dokumen Word sebenarnya adalah arsip zip berisi beberapa file, yang utama berada di XML .
unzip -l Position-Paper-Final-Version.docx
Mac OS X menyertakan utilitas zipgrep untuk mencari di dalam file zip.
zipgrep DeCSS Position-Paper-Final-Version.docx
Hasilnya tidak akan terlalu mudah dibaca karena file XML dalam format docx sebagian besar terdiri dari satu baris besar. Jika Anda ingin mencari di dalam teks badan utama dokumen, ekstrak file word/document.xml
dari arsip. Perhatikan bahwa selain teks dokumen, file ini berisi markup XML yang mewakili struktur dokumen. Anda dapat memijat sedikit markup XML dengan sed
untuk membaginya menjadi garis yang dikelola.
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS