grep
bir metin işleme aracıdır. Girdilerinin metin dosyaları olmasını bekler . Aynı durum tr
macOS'ta da geçerli görünüyor ( tr
ikili dosyaları desteklemesi gerekiyor olsa bile ).
Bilgisayarlar verileri bayt dizileri olarak depolar . Bir metin bir karakter dizisidir. Denilen bayt olarak kodlamak karakterler için çeşitli yollar vardır karakter kodlamaları . Dünyanın çoğu yerinde, özellikle OSX'te fiili standart karakter kodlaması , Unicode karakter kümesini kodlayan UTF-8'dir . Yalnızca 256 olası bayt var, ancak bir milyonun üzerinde olası Unicode karakter var, bu yüzden çoğu karakter çoklu bayt olarak kodlanıyor. UTF-8 değişken uzunluklu bir kodlamadır: karaktere bağlı olarak, bir karakteri kodlamak bir ila dört bayt alabilir. Bazı bayt dizileri UTF-8'de herhangi bir karakteri temsil etmez. Bu nedenle, geçerli UTF-8 metin dosyaları olmayan bayt dizileri vardır.
tr
böyle bir bayt dizisi ile karşılaştığı için şikayetçi. UTF-8'de kodlanmış bir metin dosyası görmeyi bekler, ancak geçerli UTF-8 olmayan ikili veriyi görür.
Microsoft Word belgesi bir metin dosyası değil: bir sözcük işlem belgesi. Kelime işlem belge biçimleri yalnızca metni değil aynı zamanda gömülü görüntüleri vb. De biçimlendirir. Kelime işlem biçimlerinin çoğu gibi Word biçimi de bir metin dosyası değildir.
Yerel ayarları değiştirerek metin işleme araçlarının baytlarda çalışmasını isteyebilirsiniz . Özellikle, “temelde süslü” anlamına gelen “C” yerel ayarını seçin. Komut satırında, ortam değişkenleriyle yerel ayarları seçebilirsiniz .
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
Bu herhangi bir hata vermez, ancak yine de target-file
belirttiğiniz birçok arama dizesini içermesi muhtemel olan bir ikili dosya olduğundan , faydalı bir şey yapmaz .
Bu arada, tr '\r' '\n'
Mac OS 9 veya daha eski sürümlerden kalan metin dosyalarınız yoksa çok kullanışlı bir komut değildir. \r
(satır başı) Mac OS X'ten önceki Mac OS'deki yeni satır ayırıcıydı. OSX'ten beri, yeni satır ayırıcı \n
(satır besleme, unix standardı) ve metin dosyaları satır başı içermiyor. Windows, satır sonlarını temsil etmek için iki karakterli CR-LF dizisini kullanır; tr -d '\r'
bir Windows metin dosyasını bir Unix / Linux / OSX metin dosyasına çevirirdi.
Peki bir Word belgesinde komut satırından nasıl arama yapabilirsiniz? Bir .docx
Word belgesi aslında , bir kısmı XML olan birkaç dosya içeren bir zip arşividir .
unzip -l Position-Paper-Final-Version.docx
Mac OS X, zip dosyalarının içinde arama yapmak için zipgrep yardımcı programını içerir .
zipgrep DeCSS Position-Paper-Final-Version.docx
Sonuç çok okunaklı olmayacak çünkü docx biçimindeki XML dosyaları çoğunlukla büyük bir satırdan oluşuyor. Belgenin ana gövde metninde arama yapmak istiyorsanız, dosyayı word/document.xml
arşivden çıkarın. Belge metnine ek olarak, bu dosyanın belgenin yapısını temsil eden XML işaretlemesi içerdiğini unutmayın. XML işaretlemesini biraz sed
yönetilebilir çizgilere ayırmak için masaj yapabilirsiniz .
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS