Yazdırılamayan karakterleri arama. TLDR; Yönetici Özeti
- kontrol karakterleri ve genişletilmiş unicode arayın
- yerel ayar, örneğin
LC_ALL=C
grep'in genişletilmiş unicode ile beklediğiniz şeyi yapmasını sağlamak için gereklidir
SO tercih edilen ascii olmayan char bulucular:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
üst cevapta olduğu gibi, ters grep:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
üst yanıtta olduğu gibi ama İLE LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . Daha . . bu konuda dayanılmaz detay:. . .
Yukarıdaki yorumlarda gömülü olan Harvey ile aynı fikirdeyim, yazdırılamayan karakterleri aramak genellikle daha yararlıdır VEYA gerçekten yazdırılamayacak şekilde düşünmeniz gerektiğinde ASCII olmayan düşünmek kolaydır. Harvey "şunu kullanın:" [^\n -~]
" önerir . DOS metin dosyaları için \ r ekleyin." [^\x0A\x020-\x07E]
"Anlamına gelir ve CR için \ x0D ekleyin"
Ayrıca, eşleşen dizeler terminali bozabileceğinden, yazdırılamayan karakterleri ararken grep'e -c (eşleşen desen sayısını göster) eklemek yararlıdır.
0-8 ve 0x0e-0x1f aralığını (0x80-0xff aralığına) eklemenin yararlı bir model olduğunu buldum. Bu, SEKME, CR ve LF ve bir veya iki daha nadir yazdırılabilir karakter içermez. Yani IMHO oldukça yararlı (ham de olsa) bir grep modeli BU:
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
GERÇEKTEN, genellikle bunu yapmanız gerekir:
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
Yıkmak:
LC_ALL=C - set locale to C, otherwise many extended chars will not match (even though they look like they are encoded > 0x80)
\x00-\x08 - non-printable control chars 0 - 7 decimal
\x0E-\x1F - more non-printable control chars 14 - 31 decimal
\x80-1xFF - non-printable chars > 128 decimal
-c - print count of matching lines instead of lines
-P - perl style regexps
Instead of -c you may prefer to use -n (and optionally -b) or -l
-n, --line-number
-b, --byte-offset
-l, --files-with-matches
Örneğin pratik kullanım örneği find, mevcut dizin altındaki tüm dosyaları grep için:
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} +
Grep'i zaman zaman ayarlamak isteyebilirsiniz. örneğin bazı yazdırılabilir dosyalarda veya VT'yi (0x0B - dikey sekme) hariç tutmak için kullanılan BS (0x08 - geri silme) karakterleri. BEL (0x07) ve ESC (0x1B) karakterleri de bazı durumlarda yazdırılabilir olarak kabul edilebilir.
Non-Printable ASCII Chars
** marks PRINTABLE but CONTROL chars that is useful to exclude sometimes
Dec Hex Ctrl Char description Dec Hex Ctrl Char description
0 00 ^@ NULL 16 10 ^P DATA LINK ESCAPE (DLE)
1 01 ^A START OF HEADING (SOH) 17 11 ^Q DEVICE CONTROL 1 (DC1)
2 02 ^B START OF TEXT (STX) 18 12 ^R DEVICE CONTROL 2 (DC2)
3 03 ^C END OF TEXT (ETX) 19 13 ^S DEVICE CONTROL 3 (DC3)
4 04 ^D END OF TRANSMISSION (EOT) 20 14 ^T DEVICE CONTROL 4 (DC4)
5 05 ^E END OF QUERY (ENQ) 21 15 ^U NEGATIVE ACKNOWLEDGEMENT (NAK)
6 06 ^F ACKNOWLEDGE (ACK) 22 16 ^V SYNCHRONIZE (SYN)
7 07 ^G BEEP (BEL) 23 17 ^W END OF TRANSMISSION BLOCK (ETB)
8 08 ^H BACKSPACE (BS)** 24 18 ^X CANCEL (CAN)
9 09 ^I HORIZONTAL TAB (HT)** 25 19 ^Y END OF MEDIUM (EM)
10 0A ^J LINE FEED (LF)** 26 1A ^Z SUBSTITUTE (SUB)
11 0B ^K VERTICAL TAB (VT)** 27 1B ^[ ESCAPE (ESC)
12 0C ^L FF (FORM FEED)** 28 1C ^\ FILE SEPARATOR (FS) RIGHT ARROW
13 0D ^M CR (CARRIAGE RETURN)** 29 1D ^] GROUP SEPARATOR (GS) LEFT ARROW
14 0E ^N SO (SHIFT OUT) 30 1E ^^ RECORD SEPARATOR (RS) UP ARROW
15 0F ^O SI (SHIFT IN) 31 1F ^_ UNIT SEPARATOR (US) DOWN ARROW
GÜNCELLEME: Bunu son zamanlarda tekrar ziyaret etmek zorunda kaldım. Ve, YYMV terminal ayarlarına / güneş hava tahminlerine bağlı olarak AMA. . Grep'in birçok unicode veya genişletilmiş karakter bulamadığını fark ettim . Sezgisel olarak 0x80 ila 0xff aralığına uymaları gerekse de, 3 ve 4 baytlık unicode karakterler eşleşmedi. ??? Herkes bunu açıklayabilir mi? EVET. @ frabjous sordu ve @calandoa, LC_ALL=C
grep eşleşmesi yapma komutunun yerel ayarını yapmak için kullanılması gerektiğini açıkladı .
örneğin yerel ayarım LC_ALL=
boş
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
LC_ALL=
boş eşlemeler 2 bayt kodlanmış karakterlerle grep, ancak 3 ve 4 bayt kodlanmış değil:
$ grep -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" notes_unicode_emoji_test
5:© copyright c2a9
7:call underscore c2a0
9:CTRL
31:5 © copyright
32:7 call underscore
grep with LC_ALL=C
istediğiniz tüm genişletilmiş karakterlerle eşleşiyor gibi görünüyor:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
1:���� unicode dashes e28090
3:��� Heart With Arrow Emoji - Emojipedia == UTF8? f09f9298
5:� copyright c2a9
7:call� underscore c2a0
11:LIVE��E! ���������� ���� ���������� ���� �� �� ���� ���� YEOW, mix of japanese and chars from other e38182 e38184 . . e0a487
29:1 ���� unicode dashes
30:3 ��� Heart With Arrow Emoji - Emojipedia == UTF8 e28090
31:5 � copyright
32:7 call� underscore
33:11 LIVE��E! ���������� ���� ���������� ���� �� �� ���� ���� YEOW, mix of japanese and chars from other
34:52 LIVE��E! ���������� ���� ���������� ���� �� �� ���� ���� YEOW, mix of japanese and chars from other
81:LIVE��E! ���������� ���� ���������� ���� �� �� ���� ���� YEOW, mix of japanese and chars from other
BU perl eşleşmesi (kısmen stackoverflow üzerinde başka bir yerde bulunur) VEYA üst cevaptaki ters grep, yerel ayarı ayarlamadan TÜM ~ garip ~ ve ~ harika ~ "ascii olmayan" karakterleri buluyor gibi görünüyor:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
1 ‐‐ unicode dashes e28090
3 💘 Heart With Arrow Emoji - Emojipedia == UTF8? f09f9298
5 © copyright c2a9
7 call underscore c2a0
9 CTRL-H CHARS URK URK URK
11 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ YEOW, mix of japanese and chars from other e38182 e38184 . . e0a487
29 1 ‐‐ unicode dashes
30 3 💘 Heart With Arrow Emoji - Emojipedia == UTF8 e28090
31 5 © copyright
32 7 call underscore
33 11 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ YEOW, mix of japanese and chars from other
34 52 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ YEOW, mix of japanese and chars from other
73 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ YEOW, mix of japanese and chars from other
SO tercih edilen ascii olmayan char bulucular:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
üst cevapta olduğu gibi, ters grep:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
üst yanıtta olduğu gibi ama İLE LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test