인쇄 할 수없는 문자를 검색합니다. TLDR; 행정상 개요
- 제어 문자 및 확장 유니 코드 검색
- 로케일 설정, 예를 들어
LC_ALL=C
grep이 확장 유니 코드로 예상되는 것을 수행하도록하는 데 필요
선호하는 비 ASCII 문자 찾기 :
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
상단 답변에서와 같이 역 그렙 :
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
최고 답변과 같지만 WITH LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . 더. . 이것에 대한 극심한 세부 사항 :. . .
나는 의견에 묻힌 위의 Harvey에 동의합니다. 인쇄 할 수없는 문자를 검색하는 것이 더 유용하거나 실제로 인쇄 할 수없는 것으로 생각해야 할 때 비 ASCII로 생각하기 쉽습니다. Harvey 는 "use this :" [^\n -~]
"를 제안 합니다. DOS 텍스트 파일에는 \ r을 추가하십시오." [^\x0A\x020-\x07E]
"로 번역되고 CR에는 \ x0D를 추가합니다"
또한 grep에 -c (일치 된 패턴 수 표시)를 추가하면 일치하는 문자열이 터미널을 망칠 수 있으므로 인쇄 할 수없는 문자를 검색 할 때 유용합니다.
범위 0-8과 0x0e-0x1f (0x80-0xff 범위)를 추가하는 것이 유용한 패턴이라는 것을 알았습니다. TAB, CR 및 LF와 하나 또는 두 개 이상의 인쇄 할 수없는 문자는 제외됩니다. 따라서 IMHO는 매우 유용한 (조잡한) grep 패턴이 다음과 같습니다.
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
실제로 일반적으로 다음을 수행해야합니다.
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
고장:
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
예를 들어 현재 디렉토리 아래의 모든 파일을 grep하는 find 사용 예제 :
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} +
때때로 grep을 조정하고 싶을 수도 있습니다. 예를 들어 일부 인쇄 가능한 파일에 사용되거나 VT (0x0B-세로 탭)를 제외하기 위해 BS (0x08-백 스페이스) 문자가 사용됩니다. BEL (0x07) 및 ESC (0x1B) 문자는 경우에 따라 인쇄 가능한 것으로 간주 될 수도 있습니다.
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
업데이트 : 최근에 이것을 다시 방문해야했습니다. 그리고 터미널 설정 / 태양 일기 예보에 따라 YYMV BUT. . grep이 많은 유니 코드 또는 확장 문자를 찾지 못했음을 알았습니다 . 직관적으로 0x80 ~ 0xff 범위와 일치해야하지만 3 및 4 바이트 유니 코드 문자는 일치하지 않습니다. ??? 누구든지 이것을 설명 할 수 있습니까? 예. @frabjous ask 및 @calandoa는 LC_ALL=C
grep이 일치하도록 명령의 로케일을 설정하는 데 사용해야한다고 설명했습니다 .
예를 들어 내 로케일이 LC_ALL=
비어 있습니다
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
LC_ALL=
비어있는 grep은 2 바이트 인코딩 문자와 일치하지만 3 바이트와 4 바이트 인코딩은 일치하지 않습니다.
$ 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
는 원하는 모든 확장 문자와 일치하는 것 같습니다.
$ 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
이 perl match (부분적으로 stackoverflow의 다른 곳에서 발견됨) 또는 최상위 답변 DO의 역 grep은 로케일을 설정하지 않고 모든 ~ weird ~ 및 ~ wonderful ~ "비 ASCII"문자를 찾는 것처럼 보입니다.
$ 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
선호하는 비 ASCII 문자 찾기 :
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
상단 답변에서와 같이 역 그렙 :
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
최고 답변과 같지만 WITH LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test