182 votes

Comment rechercher les tabulations sans utiliser les tabulations littérales et pourquoi ? \t ne fonctionne pas ?

Lorsque je recherche des tabulations dans un fichier avec (e)grep, j'utilise la tabulation littérale ( ^v + <tab> ). Je ne peux pas utiliser \t pour remplacer les tabulations dans les expressions régulières. Avec sed par exemple, cette expression fonctionne très bien.

Y a-t-il donc une possibilité d'utiliser un remplacement non littéral pour <tab> et quels sont les antécédents d'une personne qui ne travaille pas ou qui n'est pas interprétée ? \t ?

255voto

Adam Points 6342

Grep utilise des expressions régulières telles que définies par POSIX . Pour des raisons quelconques, POSIX n'a pas défini \t comme onglet.

Vous avez plusieurs possibilités :

  • indique à grep d'utiliser les expressions régulières telles qu'elles sont définies par perl (perl dispose de \t comme onglet) :

    grep -P "\t" foo.txt

    la page de manuel prévient qu'il s'agit d'une fonctionnalité "expérimentale". au moins \t semble fonctionner correctement, mais les fonctions plus avancées de regex en perl peuvent ne pas fonctionner.

  • utiliser printf pour imprimer un caractère de tabulation pour vous :

    grep "$(printf '\t')" foo.txt
  • utiliser le caractère de tabulation littéral :

    grep "^V<tab>" foo.txt

    c'est-à-dire : type grep " puis appuyez sur ctrl+v puis appuyez sur tab puis tapez " foo.txt . pressant ctrl+v dans le terminal fait en sorte que la touche suivante soit reprise textuellement. Cela signifie que le terminal insérera un caractère de tabulation au lieu de déclencher une fonction liée à la touche de tabulation.

  • utiliser le cotation ansi c de bash :

    grep $'\t' foo.txt

    cela ne fonctionne pas dans tous les shells.

  • utiliser l'awk :

    awk '/\t/'
  • utiliser sed :

    sed -n '/\t/p'

Voir le article de wikipedia sur les expressions régulières pour un aperçu des classes de caractères définies dans POSIX et d'autres systèmes.

18voto

enzotib Points 86709

Ce n'est pas exactement la réponse que vous souhaiteriez entendre, mais une utilisation possible des séquences d'échappement est fournie par bash

command | grep $'\t'

(ne le mettez pas entre guillemets !).

2voto

awk '/\t/' est ma solution de rechange préférée :

printf 'a\t\nb' | awk '/\t/'

Sortie : a\t .

2voto

Sergiy Kolodyazhnyy Points 97292

On peut toujours utiliser le code hexagonal ascii pour les tabulations :

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X