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 ....


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'


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.

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' 

1

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

rg -w 's:text' . 

Deberías hacerlo


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.


¿Qué pasa si el "texto" está al final de la salida? ¿No se omitirá en su solución?
pkuszewski
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.