Recherche de caractères non imprimables. TLDR; Résumé
- recherche de caractères de contrôle ET d'unicode étendu
- paramètre local par exemple
LC_ALL=C
nécessaire pour que grep fasse ce que vous attendez avec unicode étendu
SO les trouveurs de caractères non ascii préférés:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
comme dans la première réponse, la grep inverse:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
comme dans la première réponse mais AVEC LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . plus . . détail atroce à ce sujet:. . .
Je suis d'accord avec Harvey ci-dessus enterré dans les commentaires, il est souvent plus utile de rechercher des caractères non imprimables OU il est facile de penser non ASCII alors que vous devriez vraiment penser non imprimable. Harvey suggère "utilisez ceci:" [^\n -~]
". Ajoutez \ r pour les fichiers texte DOS. Cela se traduit par" [^\x0A\x020-\x07E]
"et ajoutez \ x0D pour CR"
De plus, l'ajout de -c (afficher le nombre de modèles correspondants) à grep est utile lors de la recherche de caractères non imprimables car les chaînes correspondantes peuvent perturber le terminal.
J'ai trouvé que l'ajout de la plage 0-8 et 0x0e-0x1f (à la plage 0x80-0xff) est un modèle utile. Cela exclut le TAB, le CR et le LF et un ou deux autres caractères imprimables rares. Donc, à mon humble avis, un modèle de grep assez utile (quoique brut) est celui-ci:
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
RÉELLEMENT, vous devrez généralement faire ceci:
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
panne:
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
Exemple d'utilisation pratique de find pour grep tous les fichiers du répertoire courant:
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} +
Vous pouvez parfois ajuster le grep. Par exemple, le caractère BS (0x08 - backspace) utilisé dans certains fichiers imprimables ou pour exclure VT (0x0B - onglet vertical). Les caractères BEL (0x07) et ESC (0x1B) peuvent également être considérés comme imprimables dans certains cas.
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
MISE À JOUR: J'ai dû revoir cela récemment. Et, YYMV en fonction des paramètres du terminal / des prévisions météorologiques solaires MAIS. . J'ai remarqué que grep ne trouvait pas beaucoup de caractères unicode ou étendus. Même si intuitivement, ils doivent correspondre à la plage 0x80 à 0xff, les caractères unicode à 3 et 4 octets ne correspondent pas. ??? Quelqu'un peut-il expliquer cela? OUI. @frabjous a demandé et @calandoa a expliqué que cela LC_ALL=C
devrait être utilisé pour définir les paramètres régionaux pour que la commande fasse correspondre grep.
par exemple, mes paramètres régionaux sont LC_ALL=
vides
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
grep avec LC_ALL=
vide correspond à des caractères codés sur 2 octets mais pas codés sur 3 et 4 octets:
$ 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
semble correspondre à tous les caractères étendus que vous souhaitez:
$ 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
CETTE correspondance perl (partiellement trouvée ailleurs sur stackoverflow) OU l'inverse grep sur la réponse du haut semble trouver TOUS les caractères ~ bizarre ~ et ~ merveilleux ~ "non-ascii" sans définir les paramètres régionaux:
$ 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 les trouveurs de caractères non ascii préférés:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
comme dans la première réponse, la grep inverse:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
comme dans la première réponse mais AVEC LC_ALL=C
:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test