(grep) ASCII olmayan karakterlerle eşleşecek şekilde normal ifade?


169

Linux'ta çok sayıda dosya içeren bir dizinim var. Bazılarının ASCII olmayan karakterleri vardır, ancak hepsi geçerli UTF-8'dir . Bir program, ASCII olmayan dosya adlarıyla çalışmasını engelleyen bir hataya sahiptir ve kaç tanesinin etkilendiğini bulmak zorundayım. Bunu ASCII olmayan karakterleri yazdırmak için findbir grep yapacağım ve sonra wc -lnumarayı bulmak için bir yapacağım. Grep olmak zorunda değil; Ben herhangi bir standart Unix kullanabilirsiniz düzenli ifade gibi, Perl , sed , AWK vb

Ancak, 'ASCII karakteri olmayan herhangi bir karakter' için düzenli bir ifade var mı?


1
Paul, evet perl kullanabilirim
Rory

/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Tinmarino

Yanıtlar:


311

Bu, ASCII olmayan tek bir karakterle eşleşir:

[^\x00-\x7F]

Bu geçerli bir PCRE'dir ( Perl Uyumlu Düzenli İfade ).

POSIX kısayollarını da kullanabilirsiniz :

  • [[:ascii:]] - tek bir ASCII karakteriyle eşleşir
  • [^[:ascii:]] - tek bir ASCII olmayan karakterle eşleşir

[^[:print:]] muhtemelen sizin için yeterli olacaktır. **


3
@adrianm: Hayır, PCRE'de ^geçerlidir.
Alix Axel

10
Bu kesinlikle doğru. Ancak standart grep değil, pcregrep kullanmanız gerekir. [^ [: print:]], terminaliniz UTF8'de ayarlanmışsa çalışmaz.
Rory

@Rory, neden :print:bir UTF8 terminalinde çalışmaz? Bu bir UTF8 terminali gözetlemek benim için çalışıyor:27.chr =~ /[^[:print:]]/
akostadinov

Bu, kötü dosya adlarını düzeltmek için gerçekten güzel - rename 's/[^\x00-\x7F]//g' *( -nönce adların iyi olup olmadığını kontrol etmek için kullanabilirsiniz ).
naught101

UTF8 olmayan bir karakterle ve diğer belirli karakterlerle nasıl eşleşirim?
CMCDragonkai

37

Hayır, [^\x20-\x7E]ASCII değil.

Bu gerçek ASCII:

 [^\x00-\x7F]

Aksi takdirde, ASCII tablosunun parçası olan yeni satırları ve diğer özel karakterleri keser!



3

[^\x00-\x7F]ve [^[:ascii:]]bazı kontrol baytlarını kaçırdığınızda dizeler bazen daha iyi bir seçenek olabilir. Örneğin cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g', terminalinize garip şeyler yapacak, nerede strings test.torrentdavranacaksınız.


3

Metin Kutusunu Doğrulamak İçin Yalnızca Ascii'yi Kabul Et Bu Deseni Kullan

[\x00-\x7F]+



2

Bu normal ifadeyi kullanabilirsiniz:

[^\w \xC0-\xFF]

Durum sormak, seçenekleri Çok Satırlı olduğunu .


2

Gerçekten normal ifadeye ihtiyacınız yok.

printf "%s\n" *[!\ -~]*

Bu, adlarında kontrol karakterleri olan dosya adlarını da gösterecektir, ancak bir özellik olduğunu düşünüyorum.

Eşleşen bir dosyanız yoksa, siz nullglobayarlamadığınız sürece glob kendiliğinden genişler . (İfade, kendisiyle eşleşmez, bu nedenle teknik olarak, bu çıktı kesin değildir.)


Gecikerek, bu o gözlemleyebilirsiniz yapar aslında bu kalıpla eşleşen bazı dosyalar varsa doğru işi. Eşleşme olmadığında desenin kendisini yazdırdığı davranış biraz şaşırtıcı ama aslında doğrudur. Bunu umarım netleştirmek için cevabı düzenledim.
Üçlü

1

Bunun çok esnek ve genişletilebilir olduğu ortaya çıktı. $ field = ~ s / [^ \ x00- \ x7F] // g; # Böylece ASCII olmayan veya söz konusu belirli öğeler temizlenebilir. Sonunda hash anahtarları olacak öğelerin seçiminde veya ön işleminde çok güzel.

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.