Grep kullanırken ekranda tuhaf semboller var mı?


12

./trans ... çıkış kodlarını gösteren komut çıkışı

Buna ne sebep olabileceği hakkında bir fikrin var mı? Grep kullanmadan, görüntülenen tek şey ISO kodları ve boş alan var.

Kullanılan yazılım

Komut: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'

Normal çıktı:

okunabilir metin ve URL'lerle trans komut çıkışı


Lütfen görüntü eklemek yerine çıktıyı yapıştırın. Böylece diğerleri, sistemlerinde aynısını üretmek için yapıştırılan komutu yeniden kullanabilir.
Thushi

9
@Thushi Bu durumda bir ekran görüntüsü uygundur, çünkü eksik glif sembollerini buraya yapıştıramazlardı.
Sparhawk

Eğer Can düzenleme komutunun ekran görüntüsünde sondaki olmadan çalıştırmak grepler ve sonucudur alias grepve type grep?
Michael Homer

Yanıtlar:


28

Ekran görüntüsünün , metin oluşturmayı kontrol eden karışık ANSI renk kodlarını gösterdiği görülüyor . Kalın / parlak metin, ␛[1mgenellikle terminaliniz tarafından yorumlanan ve doğrudan ekranda görüntülenmeyen bir sekansla üretilir : sadece metnin bir sonraki bitini parlaklaştırır. Un grepped çıktısının ekran görüntüsü, her satırdaki etiketler ve değerler arasındaki renk farkını gösterir, böylece orijinal çıktı bunları kullanır.

Bu sıra, grepkoddaki "m" ile eşleşen (bir harf olduğu için [a-z]) ve kırmızı ile vurgulamaya çalışan finaliniz tarafından kırılmış gibi görünüyor . Bu, terminalinizin işleyemediği kısmi bir kaçış dizisi bıraktı.

Kaçış karakteri , bilinmeyen karakter kutularında görüntülenen onaltılık sayı olan U + 001B'dir. Görüntülenen çıkış (kutu), a [, a 1, kırmızı ve mardından beklenen eşleşen "eng" metni ve sonunda "22" ("normal renk ve yoğunluk" için sayısal kod) ile aynıdır.


Kırık çıktı gerçekten:

␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m 

burada ␛[31mmetin kırmızı olur ve ␛[22mher ikisi grepde mkarakterlerin etrafından orijinal metne eklenir . Orijinal sadece:

 ␛ [1m eng ␛ [22m 

ki bu sadece parlak " eng" ve ardından normal metne geri dönüyor.

Finali değiştirerek ve grepiçine grep --color=alwaysboru oluşturarak bunu kontrol edebilirsiniz hexdump, bu da yazdırılamayan tüm karakterleri ve terminaliniz tarafından yorumlanan karakterleri gösterecektir.


Bununla birkaç yolla başa çıkabilirsiniz. Bunlardan biri şu grepan için takma adınız olmadan kullanmaktır :

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]

Ters eğik çizgi geçici olarak takma adı atlar ve grepdoğrudan çalışır .

Başka bazı öneriler vardır kendisi için orijinal komutundan ANSI kodları, dışarı şerit etmektir bu soru :

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

Yine bir başka seçenek de ucuna yabancı bir boru eklemektir:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat

Finalin grepçıktısı doğrudan TTY'ye değil, catbir boru yoluyla, renkli vurgulamayı eklemez.

Belki de en iyi seçenek, Çevirme Kabuğu'nu terminal kontrol dizilerini, bir terminalde olmadığında ilk etapta kendi çıkışında kullanmayı bıraktırmaktır. Bu, sizden yazarlarına bir hata raporu ve Translate Shell'in ansi()işlevine yönelik bir kod düzeltmesi içerecektir , ancak biri bunu biraz koruyabilir:

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

Bu dumb, en azından ECMA-48 renk desteğine sahip olmadığını tanıdığı Çevir Kabuğu ortamındaki terminal türünü geçer . (Ne yazık ki, Translate Shell terminfo kullanmaz ve sadece kendi kodunda anladığı terminal türlerini ve kullandığı kontrol sekanslarını sabitleştirir.)


vay, bunu kendim ve böyle bir yer olmadan asla hata ayıklayamam, bu yüzden teşekkür ederim!
Freedo

IMO suçlu kolayca sadece sayıları değil, tam SGR kaçış dizilerini içeren kırık GREP_COLORveya GREP_COLORSortam değişkeni olabilir.
egmont

Vay, çok fazla çözüm. Ayrıca --color=noson grep'e ekleyebilir (veya uygulayabilirsiniz TERM=dumb)
Ángel
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.