¿Hay alguna manera de hacer "palabras" de salida grep a partir de archivos que coincidan con la expresión de búsqueda?
Si quiero encontrar todas las instancias de, digamos, "th" en varios archivos, puedo hacer:
grep "th" *
pero la salida será algo así (negrita es por mí);
algún archivo de texto: el gato se sentó en el tapete otro archivo de texto: el rápido zorro marrón otro archivo de texto: espero que esto lo explique a fondo
Lo que quiero que salga, usando la misma búsqueda, es:
the
the
the
this
thoroughly
¿Es esto posible usando grep? ¿O usando otra combinación de herramientas?
Respuestas:
Prueba grep -o
Editar: coincidencia del comentario de Phil
De los documentos :
fuente
"\w*th\w*" *
significa, así que pensé en publicar.\w
es [_ [: alnum:]], por lo que coincide básicamente con cualquier "palabra" que contenga 'th' (ya\w
que no incluye espacio). El * después de la sección citada es un globo para los archivos (es decir, que coinciden con todos los archivos en este directorio)\w
generalmente no es portátil paragrep -E
; para una portabilidad adecuada, use el nombre de la clase de caracteres POSIX en su[[:alnum:]]
lugar (o[_[:alnum:]]
si realmente quiere el guión bajo también, o intentegrep -P
si su plataforma lo tiene).-h
es completamente necesario, diría que ...?Respuesta segura de distribución cruzada (incluyendo windows minGW?)
Si está utilizando versiones anteriores de grep (como 2.4.2) que no incluye la opción -o. Usa lo anterior. De lo contrario, use la versión más simple para mantener la siguiente.
Respuesta segura de distribución cruzada de Linux
A resúmenes
-oh
, las expresiones regulares coinciden con el contenido del archivo (y no con su nombre de archivo), tal como se esperaría que funcionara la expresión regular en vim / etc ... Qué palabra o expresión regular estaría buscando entonces, depende de ¡tú! Mientras permanezca en POSIX y no en la sintaxis de Perl (consulte a continuación)Más del manual para grep
La razón por la cual la respuesta original no funciona para todos
El uso de
\w
varía de una plataforma a otra, ya que es una sintaxis "perl" extendida. Como tal, la instalación grep que se limita al trabajo con clases de caracteres POSIX usa[[:alpha:]]
y no su equivalente perl\w
. Vea la página de Wikipedia sobre expresiones regulares para másEn última instancia, la respuesta POSIX anterior será mucho más confiable independientemente de la plataforma (que es la original) para grep
En cuanto al soporte de grep sin la opción -o, el primer grep genera las líneas relevantes, el tr divide los espacios en nuevas líneas, los filtros grep finales solo para las líneas respectivas.
(PD: Sé que la mayoría de las plataformas por ahora, habrían sido parcheadas para \ w ... pero siempre hay aquellas que se quedan atrás)
Crédito por la solución "-o" de la respuesta de @AdamRosenfield
fuente
-o
opción no está presente en el grep de Windows que se instala con el paquete git (minGW?):"c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
Es más simple de lo que piensas. Prueba esto:
Dónde,
fuente
Puede traducir espacios a nuevas líneas y luego grep, por ejemplo:
fuente
tr
que podría hacerlogrep
primero, portr
lo que se aplicaría solo a las líneas coincidentes:grep th filename | tr ' ' '\n' | grep th
Simplemente
awk
, no necesita combinación de herramientas.fuente
comando grep solo para coincidencia y perl
fuente
th
porque solicitó la repetición más breve posible del comodín.No estaba satisfecho con la sintaxis difícil de recordar de awk, pero me gustó la idea de usar una utilidad para hacer esto.
Parece que ack (o ack-grep si usa Ubuntu) puede hacer esto fácilmente:
Si omite la bandera -h obtendrá:
Como
--output
beneficio adicional, puede usar el indicador para hacer esto en búsquedas más complejas con la sintaxis más fácil que he encontrado:fuente
fuente
cat
?Para buscar todas las palabras que comienzan con "icono-", el siguiente comando funciona perfectamente. Estoy usando Ack aquí, que es similar a grep pero con mejores opciones y buen formato.
fuente
También puedes probar pcregrep . También hay una
-w
opción en grep , pero en algunos casos no funciona como se esperaba.De Wikipedia :
fuente
Tuve un problema similar, buscando grep / pattern regex y el "patrón coincidente encontrado" como salida.
Al final usé egrep (la misma expresión regular en grep -e o -G no me dio el mismo resultado que egrep) con la opción -o
Entonces, creo que podría ser algo similar a (NO soy un maestro de expresiones regulares):
fuente
{1}
cuantificadores inútiles deberían descartarse. O si quieres ser consistente,t{1}h{1}e{1}
etc.Podría canalizar su salida grep a Perl de esta manera:
fuente
Extracto de la página de manual de grep:
-w: selecciona solo aquellas líneas que contienen coincidencias que forman palabras completas. La prueba es que la subcadena coincidente debe estar al principio de la línea o precedida por un carácter constituyente que no sea una palabra.
fuente
the
ya no coincida, por ejemplo, "estos" o "bañarse".ripgrep
Aquí están los ejemplos usando
ripgrep
:Coincidirá con todas las palabras que coincidan
th
.fuente