Comment grep pour les onglets sans utiliser les onglets littéraux et pourquoi ne fonctionne-t-il pas?

115

Lorsque je recherche des onglets dans un fichier avec (e) grep, j'utilise l'onglet littéral ( ^v + <tab> ). Je ne peux pas utiliser \t en remplacement des tabulations dans les expressions régulières. Avec par ex. sed cette expression fonctionne très bien.

Y a-t-il une possibilité d'utiliser un remplacement non littéral pour <tab> et quels sont les arrière-plans pour un \t ? non fonctionnel / non interprété?

    
posée Lasall 14.07.2011 - 13:59
la source

4 réponses

162

grep utilise des expressions régulières telles que définies par POSIX . Pour quelque raison que ce soit, POSIX n’a pas défini \t comme onglet.

Vous avez plusieurs alternatives:

  • Dire à grep d'utiliser les expressions régulières telles que définies par perl (perl a \t comme tab):

    grep -P "\t" foo.txt
    

    la page de manuel avertit qu'il s'agit d'une fonctionnalité "expérimentale". au moins \t semble fonctionner correctement. mais les fonctionnalités avancées de regex perl peuvent ne pas l'être.

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

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

    grep "^V<tab>" foo.txt
    

    c'est-à-dire: tapez grep " , puis appuyez sur ctrl+v , puis appuyez sur tab , puis tapez " foo.txt . Si vous appuyez sur ctrl+v dans le terminal, la clé suivante est prise 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.

  • Utilisez la fonctionnalité ansi c de bash:

    grep $'\t' foo.txt
    

    cela ne fonctionne pas dans tous les shells.

  • utiliser awk:

    awk '/\t/'
    
  • utilisez sed:

    sed -n '/\t/p'
    

Consultez l'article Wikipédia sur les expressions régulières pour obtenir un aperçu des classes de caractères définies dans POSIX et d'autres systèmes.

    
réponse donnée lesmana 14.07.2011 - 17:04
la source
12

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

command | grep $'\t'

(ne le mettez pas entre guillemets!).

    
réponse donnée enzotib 14.07.2011 - 16:15
la source
2

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

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

Sortie: a\t .

    
la source
1

On peut toujours avoir recours au code hexadécimal ascii pour l'onglet:

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

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

$ grep $'\x9' input.txt                                            
one two
    
réponse donnée Sergiy Kolodyazhnyy 03.07.2017 - 19:04
la source

Lire d'autres questions sur les étiquettes