tr “Yasadışı bayt sekansı” şikayetleri


24

UNIX için yepyeni yaşıyorum ve Kirk McElhearn'ün "Mac OS X Komut Satırı" nı kendime bazı komutlar vermek için kullanıyorum.

Kullanmaya çalışıyorum trve grepnormal bir MS-Office Word Belgesinde metin dizeleri arayabilirim.

$ tr '\r' '\n' < target-file | grep search-string

Ancak geri döndüren tek şey:

Illegal byte sequence.

robomechanoid:Position-Paper-Final-Draft robertjralph$ tr '\r' '\n' < Position-Paper-Final-Version.docx | grep DeCSS
tr: Illegal byte sequence
robomechanoid:Position-Paper-Final-Draft robertjralph$ 

Aslında aynı satırı oluşturduğum bir betikte çalıştırdım ve vidoğru bir şekilde arama yapıyor.


Tr'in neden şikayet ettiğini anlayamıyorum, soruyu yazdığınız gibi yazdınız mı? grep istediğinizi bulamaz, xdoc kötü tanımlanmış bir standarttır. Hiç kimse bu dosyalarda ne olduğunu bilmiyor, insanlar onu tersine çevirdiler, görünüşe göre standartların yardımı yoktu.
ctrl-alt-delor

Yanıtlar:


29

grepbir metin işleme aracıdır. Girdilerinin metin dosyaları olmasını bekler . Aynı durum trmacOS'ta da geçerli görünüyor ( trikili 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.

trbö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-filebelirttiğ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 .docxWord 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.xmlarş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 sedyö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

1
İyi özet ve ekstra bitler için +1. Ama söyleyecek bir şeyim var. Xml'i biçimlendirmek için, xml_pponu xml-twig-toolsDebian Gnu + Linux paketinde kullanabilirsiniz (bir mac bilmiyorum).
ctrl-alt-delor

2
Mac için Excel 2011, CSV dosyalarını satır sonlarıyla kaydeder, bu nedenle bu başlatma aslında oldukça ilgili ve yararlıdır.
Noah Yetter,

1
Bir sekmeyle dışa aktardığınızda, Mac 2011 için Outlook'ta olduğu gibi sınırlı bir kişi listesi.
Ivan X,

1
Bunu reddetmek için yeterli itibarım yok, ancak bu cevap tamamen yanlış. " tr[...] girişlerinin metin dosyaları olmasını bekler."; ise POSIX şartname açıkça belirtmektedir "standart girdi herhangi bir dosya türünde olabilir." . Lütfen cevabınızı düzeltin.
7heo.tk

@ 7heo.tk “Bu cevap tamamen yanlış” brüt exageration ama haklısın, trbir sözde (işlem boş doğru bayt özellikle, bu gerekiyordu) ikili giriş işlemek için. POSIX, bir karakter dizisi olmayan girdiyle nasıl başa çıkması gerektiğini açıkça belirtmiyor. (Bir uygulayıcısı ise, modifiye edilmemiş yoluyla geçersiz bir bayt dizileri başarılı olur (ya da bunları çıkarmak -s), ve standart komitesi bir kusur yükseltmek.) Kuşkusuz, MacOS en tr bunların şikayet etmektedir.
Gilles 'SO- kötülük olmayı'

13

Yerel ayarlardan gelen haritanızın UTF-8 olduğunu ve ikili dosyalarda sorun yaşayacağınızı varsayalım. Sadece C yereline geçin:

LC_ALL=C tr '\r' '\n' < target-file | LC_ALL=C grep search-string

dilin iki kez belirtilmesini önlemek için parantezleri kullanabilirsiniz. LC_ALL=C ( tr '\r' '\n' < target-file | grep search-string ). Ancak docx C yerel değildir. Utf16 ve sıkıştırılmış ve karmaşık ve herkesin sanırım olduğunu. Bunu html veya odt gibi işleyebileceğiniz farklı bir formata dönüştüren bir araç kullanmak gibi görünüyordu (odt ayrıca sıkıştırılmış, ancak iyi tanımlanmış ve yorumlanması kolay).
ctrl-alt-delor

1
Parantez (parantez) ile sözdizimi tüm kabuklarla çalışmaz (bash değil, zsh değil, çizgi değil). Daha sonra, MS Word dosyası ile ilgili, o bağlıdır. stringsKomutun net metin verdiği bazı dosyalar var .
vinc17

Alternatif olarak, ( export LC_ALL=C; tr '\r' '\n' < target-file | grep search-string; )çalışması gerekir.
vinc17

1
stringssüper güçleri var: sadece utf-8 ya da ascii olmayan dosyaları okuyabilir.
ctrl-alt-delor

()İşe yarayacağını düşündüğüm şey için üzgünüm , düzeltmek için @ vinc17'ye teşekkür ederiz.
ctrl-alt-delor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.