Tìm kiếm các ký tự không in được. TLDR; Tóm tắt
- tìm kiếm ký tự điều khiển VÀ unicode mở rộng
- cài đặt ngôn ngữ, ví dụ
LC_ALL=C
cần thiết để làm cho grep làm những gì bạn có thể mong đợi với unicode mở rộng
VÌ các công cụ tìm char không phải ascii ưa thích:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
như trong câu trả lời hàng đầu, grep ngược:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
như trong câu trả lời hàng đầu nhưng VỚI LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . hơn . . chi tiết thú vị về điều này :. . .
Tôi đồng ý với Harvey ở trên bị chôn vùi trong các bình luận, thường hữu ích hơn khi tìm kiếm các ký tự không in được HOẶC thật dễ dàng để nghĩ không phải ASCII khi bạn thực sự nên nghĩ rằng không thể in được. Harvey gợi ý "sử dụng cái này:" [^\n -~]
". Thêm \ r cho các tệp văn bản DOS. Điều đó dịch thành" [^\x0A\x020-\x07E]
"và thêm \ x0D cho CR"
Ngoài ra, việc thêm -c (hiển thị số mẫu được khớp) vào grep rất hữu ích khi tìm kiếm các ký tự không in được vì các chuỗi khớp có thể làm rối thiết bị đầu cuối.
Tôi thấy việc thêm phạm vi 0-8 và 0x0e-0x1f (vào phạm vi 0x80-0xff) là một mẫu hữu ích. Điều này không bao gồm TAB, CR và LF và một hoặc hai ký tự in không phổ biến khác. Vì vậy, IMHO một mẫu grep khá hữu ích (mặc dù thô) là mẫu NÀY:
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
HOẠT ĐỘNG, nói chung bạn sẽ cần phải làm điều này:
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
phá vỡ:
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
Ví dụ: ví dụ thực tế về việc sử dụng find để grep tất cả các tệp trong thư mục hiện tại:
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} +
Bạn có thể muốn điều chỉnh grep nhiều lần. ví dụ: char (0x08 - backspace) char được sử dụng trong một số tệp có thể in hoặc để loại trừ VT (0x0B - tab dọc). Các ký tự BEL (0x07) và ESC (0x1B) cũng có thể được coi là có thể in được trong một số trường hợp.
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
CẬP NHẬT: Tôi đã phải xem lại điều này gần đây. Và, YYMV tùy thuộc vào cài đặt thiết bị đầu cuối / dự báo thời tiết mặt trời NHƯNG. . Tôi nhận thấy rằng grep không tìm thấy nhiều ký tự unicode hoặc mở rộng. Mặc dù theo trực giác, chúng phải khớp phạm vi 0x80 đến 0xff, các ký tự unicode 3 và 4 byte không khớp. ??? Bất cứ ai có thể giải thích điều này? ĐÚNG. @frabjous đã hỏi và @calandoa giải thích rằng LC_ALL=C
nên được sử dụng để đặt ngôn ngữ cho lệnh để tạo grep khớp.
ví dụ địa phương của tôi LC_ALL=
trống
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
grep với LC_ALL=
các kết quả trống được mã hóa 2 byte nhưng không được mã hóa 3 và 4 byte:
$ 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 với LC_ALL=C
dường như khớp với tất cả các ký tự mở rộng mà bạn muốn:
$ 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
Kết hợp perl NÀY (được tìm thấy một phần ở nơi khác trên stackoverflow) HOẶC grep ngược trên câu trả lời hàng đầu DO dường như tìm thấy TẤT CẢ các ký tự ~ lạ ~ và ~ tuyệt vời ~ "không phải ascii" mà không đặt ngôn ngữ:
$ 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
VÌ các công cụ tìm char không phải ascii ưa thích:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
như trong câu trả lời hàng đầu, grep ngược:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
như trong câu trả lời hàng đầu nhưng VỚI LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test