2010-05-21 4 views
44

J'utilise la commande suivante pour grep choses dans subdirsComment grep pour tout mot

find . | xargs grep -s 's:text' 

Cependant, ce trouve aussi des choses comme <s:textfield name="sdfsf"...../>

Que puis-je faire pour éviter que de façon juste trouve des trucs comme <s:text name="sdfsdf"/>

ou pour cette matière .... trouve également <s:text somethingElse="lkjkj" name="lkkj"

essentiellement s:text et name devrait être sur la même ligne ....

+17

Quelqu'un at-il lu le titre comme "comment grep pour tout ** monde **"? – Earlz

+1

pour le lulz :) – josh

+7

@Earlz, non, surtout parce que j'ai googlé "Grep mot entier". –

Répondre

49

Vous voulez l'option -w de préciser que c'est la fin d'un mot.

find . | xargs grep -sw 's:text'

0

Si vous voulez juste pour filtrer la partie de texte reste, vous pouvez le faire.

xargs grep -s 's:text '

Cela devrait trouver que s:text cas avec un espace après le dernier t. Si vous avez besoin de trouver s:text instances qui ont seulement un élément de nom, soit tube résultats à une autre expression grep, ou utiliser regex pour filtrer uniquement les éléments dont vous avez besoin.

+0

que faire si le "texte" est à la fin de la sortie? Ne sera-t-il pas ignoré dans votre solution? – pkuszewski

22

Vous pouvez déposer la commande xargs en faisant grep recherche récursive. Et normalement, vous n'avez pas besoin du drapeau 's'. Par conséquent:

grep -wr 's:text' 
23

Utilisez \b pour correspondre à des « limites de mots », qui fera de votre match de recherche sur seulement des mots entiers.

Ainsi, votre grep ressemblerait à quelque chose comme

grep -r "\bSTRING\b" 

ajouter des numéros de couleur et la ligne peut aider aussi

grep --color -rn "\bSTRING\b" 

De http://www.regular-expressions.info/wordboundaries.html:

Il y a trois positions différentes qui se qualifient comme limites des mots:

  • Avant le premier caractère de la chaîne, si le premier caractère est un caractère de mot .
  • Après le dernier caractère de la chaîne, si le dernier caractère est un caractère de mot.
  • Entre deux caractères dans la chaîne, où l'on est un caractère de mot et l'autre n'est pas un caractère de mot.
0

vous pouvez essayer rg, https://github.com/BurntSushi/ripgrep:

rg -w 's:text' . 

devrait le faire

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [À revoir] (/ review/low-quality-posts/17780631) –

+1

J'ai fourni la réponse: rg -w 's: text'. – ms4720