Grep et caractères non imprimables

Ça ne vous est jamais arrivé d’être persuadé de pouvoir faire quelque-chose avec une commande et de ne pas y arriver?

Habitué aux expressions régulières compatible Perl (PCRE), j’étais persuadé qu’il était possible de “greper” des caractères non imprimables comme CR LF TAB etc… Et bien je n’y arrive pas. Impossible de faire une recherche sur les valeurs HEX des caractères non plus.

Par exemple pour les LF j’ai essayé:

grep -l '\n' fichier grep -l "\n" fichier grep -l '\x0D' fichier grep -l '\x0d' fichier

Je sais que je peux utiliser d’autres voies (sed, od etc…) mais je trouve bizarre que ce ne soit pas prévu dans GNU grep. Problème de version (GNU grep 2.5.1)? Ou je m’y prends comme un manche? :smt017

.

@ tellmewhy: oui effectivement, mais ça englobe toute la classe des “non printable”. Je voulais matcher sur un caractère particulier. Mais j’ai trouvé.

@ ripat: RTFM! man bash.

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped char‐ acters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows: \a alert (bell) \b backspace \e an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \cx a control-x character

Il faut utiliser une forme spéciale d’expansion de variable du shell pour prendre en compte la séquence escape:

[code]$ printf ‘hello\tworld’ | grep -l $’\t’
(entrée standard)

$ printf “Hello\tWorld”|grep -l $’\x09’
(entrée standard)
[/code]

Et ça, ça marche comme attendu. Testé sur bash et ksh93. Je n’ai pas trouvé tout seul. J’ai fait appel au forum unix.com. Il y a de très grosses pointures en script sur ce site.
unix.com/shell-programming-s … cters.html