Mencari karakter yang tidak dapat dicetak. TLDR; Ringkasan bisnis plan
- mencari karakter kontrol dan unicode diperpanjang
- pengaturan lokal misalnya
LC_ALL=C
diperlukan untuk membuat grep melakukan apa yang Anda harapkan dengan unicode diperpanjang
SO pencari non-ascii char yang disukai:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
seperti pada jawaban teratas, grep terbalik:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
seperti pada jawaban teratas tetapi DENGAN LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . lebih lanjut. . detail yang luar biasa tentang ini:. . .
Saya setuju dengan Harvey yang terkubur dalam komentar, seringkali lebih berguna untuk mencari karakter yang tidak dapat dicetak ATAU mudah untuk berpikir non-ASCII ketika Anda benar-benar harus berpikir tidak dapat dicetak. Harvey menyarankan "gunakan ini:" [^\n -~]
". Tambahkan \ r untuk file teks DOS. Itu berarti" [^\x0A\x020-\x07E]
"dan tambahkan \ x0D untuk CR"
Juga, menambahkan -c (tunjukkan jumlah pola yang cocok) ke grep berguna saat mencari karakter yang tidak dapat dicetak karena string yang cocok dapat mengacaukan terminal.
Saya menemukan menambahkan rentang 0-8 dan 0x0e-0x1f (ke kisaran 0x80-0xff) adalah pola yang berguna. Ini tidak termasuk TAB, CR dan LF dan satu atau dua karakter yang tidak biasa dicetak. Jadi IMHO pola grep yang cukup berguna (meskipun kasar) adalah yang INI:
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
SEBENARNYA, secara umum Anda perlu melakukan ini:
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
kerusakan:
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
Contoh praktis penggunaan find untuk menangkap semua file di bawah direktori saat ini:
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} +
Anda mungkin ingin sesekali menyesuaikan grep. misalnya karakter BS (0x08 - backspace) yang digunakan dalam beberapa file yang dapat dicetak atau untuk mengecualikan VT (0x0B - tab vertikal). Karakter BEL (0x07) dan ESC (0x1B) juga dapat dianggap dapat dicetak dalam beberapa kasus.
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
UPDATE: Saya harus meninjau kembali ini baru-baru ini. Dan, YYMV tergantung pada pengaturan terminal / ramalan cuaca matahari NAMUN. . Saya perhatikan bahwa grep tidak menemukan banyak karakter unicode atau extended. Meskipun secara intuitif mereka harus cocok dengan kisaran 0x80 hingga 0xff, 3 dan 4 byte karakter unicode tidak cocok. ??? Adakah yang bisa menjelaskan ini? IYA. @frabjous bertanya dan @calandoa menjelaskan ituLC_ALL=C
harus digunakan untuk mengatur lokal untuk perintah untuk membuat grep cocok.
mis. lokal saya LC_ALL=
kosong
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
grep dengan LC_ALL=
kecocokan kosong 2 byte karakter yang dikodekan tetapi tidak 3 dan 4 byte yang dikodekan:
$ 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
tampaknya cocok dengan semua karakter diperluas yang Anda inginkan:
$ 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
Kecocokan perl INI (sebagian ditemukan di tempat lain di stackoverflow) ATAU grep terbalik pada jawaban atas DO tampaknya menemukan SEMUA karakter ~ aneh ~ dan ~ luar biasa ~ "non-ascii" tanpa menetapkan lokal:
$ 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 pencari non-ascii char yang disukai:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
seperti pada jawaban teratas, grep terbalik:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
seperti pada jawaban teratas tetapi DENGAN LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test