Comment puis-je grep sans espaces blancs?


17

Je cherche à travers une grande base de code, et les espaces blancs et la tabulation de premier plan semblent être assez ennuyeux. Y a-t-il moyen de s'en débarrasser?

grep -R "something" ./

Par exemple, au lieu de:

foo/bar.cpp:                       qwertyuiosomethingoi
foo/bar/baz.h:                          43rfsgsomethingdrfg
bar/bar.cpp:            1234edwssomethingczd

Je veux obtenir quelque chose comme:

foo/bar.cpp: qwertyuiosomethingoi
foo/bar/baz.h: 43rfsgdsomethingrfg
bar/bar.cpp: 1234edwssomethingczd

Ou mieux:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd

Débarrassez-vous où? Dans la sortie? Dans le modèle de recherche?
Ignacio Vazquez-Abrams le

@Ignacio, en sortie. Question mise à jour
Andrew

Réponses:


4

Créer des fichiers de test

echo -e "\t   foo-somethingfoo" >something.foo
echo "    bar-bar-somethingbar" >something.bar_bar
echo "baz-baz-baz-somethingbaz" >something.baz_baz_baz
echo "  spaces    something  s" >something.spaces

produire des couleurs glorieuses :)

grep --colour=always "something" something.* | 
 sed -re  's/^([^:]+):(\x1b\[m\x1b\[K)[[:space:]]*(.*)/\1\x01\2\3/' |
   column -s $'\x01' -t

sortie (exécutez-le pour obtenir la couleur).

something.bar_bar      bar-bar-somethingbar
something.baz_baz_baz  baz-baz-baz-somethingbaz
something.foo          foo-somethingfoo
something.spaces       spaces    something  s

Testé gnome-terminal, konsole, terminator,xterm


bon travail! un petit problème, cependant, vous oubliez de faire correspondre les \tpersonnages
Andrew

\t? ... Il n'utilise pas \tpour un séparateur, il utilise $ '\ x01' (hex 01) ... ou voulez-vous dire autre chose?
Peter.O

Je veux dire qu'il peut y avoir des tabulations principales \t ainsi que des espaces blancs de premier plan\s
Andrew

... fixe. Remplacé par `` [[:space:]]si vous souhaitez uniquement considérer TAB et SPACE, et non tous les espaces, utilisez-le à la place:[ \t]
Peter.O

6

Vous pouvez simplement les éliminer en utilisant sed

grep blah filename.foo | sed -e 's/^[ \t]*//'

Cela supprimera les principaux espaces blancs de la sortie


1
Cela n'aura aucun effet, car il n'y a pas d'espaces au début d'une ligne dans la sortie.
Abhishek A

6

En supposant que vous recherchez un motif re(une expression régulière de base) dans un fichier et que vous souhaitez supprimer les espaces de tête de toutes les lignes correspondantes:

sed -n -e 's/^[[:blank:]]*//' -e '/re/p' thefile.c

(en fait, cela supprime d'abord tous les espaces blancs, puis recherche le motif, mais le résultat est le même)

Pour post-traiter le grep sortie à la place (comme dans votre question modifiée):

grep re * | sed 's/:[[:blank:]]*/: /'

Le motif [[:blank:]]*correspond à zéro ou plusieurs espaces ou tabulations.


Merci, le dernier extrait fonctionne bien. Existe-t-il un moyen de conserver la couleur de sortie?
Andrew

Couleur? Appelez-moi à l'ancienne, mais mon terminal est strictement noir et orange ... (c'est un "je ne sais pas").
Kusalananda

3
Utilisez --color = always (en supposant GNU grep) lors de l'appel grep. L'appel sed ne supprime pas les couleurs, c'est grep lui-même qui n'utilise pas la couleur lorsque la sortie ne va pas à un terminal (avec la valeur par défaut --color = auto). "toujours" l'oblige, enfin, à toujours utiliser la couleur.
Jürgen A. Erhard

@Jurgen, merci, mais avec --color=alwayscette expression régulière ne fonctionne pas: /
Andrew

1
Oh merde, vous avez raison. C'est parce qu'il y a des séquences de contrôle (pour la couleur) entre les deux points et l'espace blanc. Vous pouvez mettre les séquences d'échappement dans l'appel sed (la séquence est, au moins pour une émulation vt100 standard (xterm, screen, etc.) "\ 033 [m \ 033 [K". Je pense.; D
Jürgen A Erhard

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.