Jak mogę zidentyfikować znaki spoza ASCII z powłoki?

13

Czy istnieje prosty sposób, aby wydrukować wszystkie znaki spoza ASCII i numery linii, na których występują one w pliku przy użyciu narzędzia wiersza polecenia, takie jak grep, awk, perlitp?

Chcę zmienić kodowanie pliku tekstowego z UTF-8 na ASCII, ale zanim to zrobię, chcę ręcznie zastąpić wszystkie wystąpienia znaków spoza ASCII, aby uniknąć nieoczekiwanych zmian znaków spowodowanych przez procedurę konwersji pliku.

użytkownik001
źródło

Odpowiedzi:

14
$ perl -ne 'print "$. $_" if m/[\x80-\xFF]/'  utf8.txt
2 Pour être ou ne pas être
4 Byť či nebyť
5 是或不

lub

$ grep -n -P '[\x80-\xFF]' utf8.txt
2:Pour être ou ne pas être
4:Byť či nebyť
5:是或不

gdzie jest utf8.txt

$ cat utf8.txt
To be or not to be.
Pour être ou ne pas être
Om of niet zijn
Byť či nebyť
是或不
RedGrittyBrick
źródło
1
Dzięki. Fragment kodu perla działa bezpośrednio, ale wersja grep nie działa z GNU grep 2.16. Udało mi się sprawić, aby działał poprzez:, LC_ALL=C grep -n -P [$'\x80'-$'\xFF']gdzie pierwszy bit wyłącza sortowanie.
Joe Corneli
4

Chcę zmienić kodowanie pliku tekstowego z UTF-8 na ASCII ...

... zamień wszystkie wystąpienia znaków spoza ASCII ...

Następnie powiedz swojemu narzędziu do konwersji, aby to zrobiło.

$ iconv -c -f UTF-8 -t ASCII <<< 'Look at 私.'
Look at .

$ iconv -c -f UTF-8 -t ASCII//translit <<< 'áēìöų'
aeiou
Ignacio Vazquez-Abrams
źródło
Powiedział, że chce zrobić tę wymianę ręcznie. Być może najbardziej odpowiednia zamiana zależy od kontekstu.
mark4o