Suche nach nicht druckbaren Zeichen. TLDR; Zusammenfassung
- Suche nach Steuerzeichen UND erweitertem Unicode
- Gebietsschemaeinstellung, z. B.
LC_ALL=C
erforderlich, damit grep das tut, was Sie mit erweitertem Unicode erwarten
SO die bevorzugten Nicht-ASCII-Zeichensucher:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
wie in der oberen Antwort, die inverse grep:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
wie in der oberen Antwort, aber MIT LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . Mehr . . qualvolles Detail dazu :. . .
Ich stimme Harvey zu, der oben in den Kommentaren vergraben ist. Oft ist es sinnvoller, nach nicht druckbaren Zeichen zu suchen, oder es ist einfach, nicht ASCII zu denken, wenn Sie wirklich nicht druckbar denken sollten.Harvey schlägt "use this:" [^\n -~]
"vor. Fügen Sie \ r für DOS-Textdateien hinzu. Das bedeutet"[^\x0A\x020-\x07E]
"und fügen Sie \ x0D für CR" hinzu.
Außerdem ist das Hinzufügen von -c (Anzahl der übereinstimmenden Muster anzeigen) zu grep hilfreich, wenn nach nicht druckbaren Zeichen gesucht wird, da die übereinstimmenden Zeichenfolgen das Terminal durcheinander bringen können.
Ich fand, dass das Hinzufügen der Bereiche 0-8 und 0x0e-0x1f (zum Bereich 0x80-0xff) ein nützliches Muster ist. Dies schließt TAB, CR und LF sowie ein oder zwei weitere ungewöhnliche druckbare Zeichen aus. Meiner Meinung nach ist DIESES ein ziemlich nützliches (wenn auch grobes) Grep-Muster:
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
TATSÄCHLICH müssen Sie im Allgemeinen Folgendes tun:
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
Nervenzusammenbruch:
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
Beispiel: Ein praktisches Anwendungsbeispiel zum Suchen aller Dateien im aktuellen Verzeichnis:
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} +
Möglicherweise möchten Sie den Grep manchmal anpassen. zB BS-Zeichen (0x08 - Rücktaste), das in einigen druckbaren Dateien verwendet wird oder um VT auszuschließen (0x0B - vertikale Registerkarte). In einigen Fällen können die Zeichen BEL (0x07) und ESC (0x1B) auch als druckbar angesehen werden.
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: Ich musste dies kürzlich noch einmal überprüfen. Und YYMV abhängig von Terminaleinstellungen / Sonnenwettervorhersage ABER. . Ich bemerkte, dass grep nicht viele Unicode- oder erweiterte Zeichen fand. Obwohl sie intuitiv mit dem Bereich von 0x80 bis 0xff übereinstimmen sollten, wurden 3- und 4-Byte-Unicode-Zeichen nicht abgeglichen. ??? Kann jemand das erklären? JA. @frabjous fragte und @calandoa erklärte dasLC_ALL=C
dass das Gebietsschema für den Befehl festgelegt werden sollte, damit grep übereinstimmt.
zB mein Gebietsschema LC_ALL=
leer
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
grep mit LC_ALL=
leeren Übereinstimmungen 2 Byte codierte Zeichen, aber nicht 3 und 4 Byte codiert:
$ 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
scheint mit allen erweiterten Zeichen übereinzustimmen , die Sie möchten:
$ 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
DIESES Perl-Match (teilweise an anderer Stelle im Stackoverflow zu finden) ODER das inverse Grep in der oberen Antwort scheinen ALLE ~ seltsamen ~ und ~ wunderbaren ~ "Nicht-ASCII" -Zeichen zu finden, ohne das Gebietsschema festzulegen:
$ 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 die bevorzugten Nicht-ASCII-Zeichensucher:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
wie in der oberen Antwort, die inverse grep:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
wie in der oberen Antwort, aber MIT LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test