Cómo hacer grep para toda la palabra

82

Estoy usando el siguiente comando para grep cosas en subdirecciones

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

Sin embargo, esto también encuentra cosas como <s:textfield name="sdfsf"...../>

¿Qué puedo hacer para evitarlo y encontrar cosas como <s:text name="sdfsdf"/>

O para el caso ... también encuentra <s:text somethingElse="lkjkj" name="lkkj"

básicamente s:texty namedebería estar en la misma línea ....

Josh
fuente
29
¿Alguien leyó el título como "cómo hacer grep para el mundo entero "?
Earlz
14
@Earlz, no, principalmente porque busqué en Google "palabra completa grep".
Luke

Respuestas:

99

Desea que la -wopción especifique que es el final de una palabra.

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

Derek H
fuente
66

Úselo \bpara hacer coincidir "límites de palabras", lo que hará que su búsqueda coincida solo con palabras completas.

Entonces tu grep se vería algo así como

grep -r "\bSTRING\b"

agregar colores y números de línea también puede ayudar

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

De http://www.regular-expressions.info/wordbo limits.html :

Hay tres posiciones diferentes que califican como límites de palabras:

  • Antes del primer carácter de la cadena, si el primer carácter es un carácter de palabra.
  • Después del último carácter de la cadena, si el último carácter es una palabra.
  • Entre dos caracteres en la cadena, donde uno es un carácter de palabra y el otro no es un carácter de palabra.
cs01
fuente
28

Puede eliminar el xargscomando haciendo una búsqueda grep de forma recursiva. Y normalmente no necesita la bandera 's'. Por lo tanto:

grep -wr 's:text' 
joctee
fuente
1

podría probar rg, https://github.com/BurntSushi/ripgrep :

rg -w 's:text' . 

Deberías hacerlo

ms4720
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si cambia la página enlazada. - De la crítica
Jibin Balachandran
3
Proporcioné la respuesta: rg -w 's: text'.
ms4720
1
Puede haber otras razones para sugerir una herramienta no estándar, pero como solución a una pregunta sobre cómo resolver esto con estándar, grepesto no es particularmente convincente o satisfactorio, especialmente dado que greptiene la misma opción.
tripleee
Depende de la profundidad y de la grasa de los directi
ms4720
Depende de la cantidad de archivos, ripgrep puede ser mucho más rápido y find-> xargs crea un nuevo proceso para cada archivo.
ms4720
0

Si solo desea filtrar la parte del texto restante, puede hacerlo.

xargs grep -s 's:text '

Esto debería encontrar solo s:textinstancias con un espacio después de la última t. Si necesita encontrar s:textinstancias que solo tengan un elemento de nombre, canalice sus resultados a otra grepexpresión o use regex para filtrar solo los elementos que necesita.

Stefan Kendall
fuente
¿Qué pasa si el "texto" está al final de la salida? ¿No se omitirá en su solución?
pkuszewski