grep para cadenas alfanuméricas de cualquier longitud con dos puntos a cada lado

14

¿Cómo buscaría una cadena alfanumérica de 1 a 50 caracteres (idealmente, cualquier longitud también funcionaría) con dos puntos a cada lado? Un resultado típico sería todas las líneas que contienen la cadena :shopping:. Hasta ahora tengo el siguiente código (he probado algunas variaciones) que no funciona:

grep ':[[:alnum:]]{1,100}:' ~/x.txt

fuente
Solo necesita habilitar las capacidades extendidas de regex grepal incluir el -Econmutador.
slm

Respuestas:

13

Debe habilitar expresiones regulares extendidas para esto:

grep -E ':[[:alnum:]]+:' ~/x.txt
Joseph R.
fuente
4

Con expresiones regulares básicas, puedes escribirlo como:

grep ':[[:alnum:]]\{1,100\}:' ~/x.txt

Tenga en cuenta que \{(a diferencia de \+o \?por ejemplo) es estándar y portátil, y en realidad los equivalentes BRE de +y ?generalmente se escriben con \{: \{1,\}y \{0,1\}. grep -ESin embargo, también es estándar y portátil, por lo que podría usarlo ya que genera expresiones regulares más legibles en esos casos.

Stéphane Chazelas
fuente
1

Está utilizando una expresión regular extendida, por lo que debe usar la opción -E:

grep -E ':[[:alnum:]]{1,100}:' ~/x.txt
Msegade
fuente
¡Gracias! Puse la otra respuesta como correcta porque no escribí mi guión "ideal" en el título, y no quiero que la gente que busca una respuesta en Google copie y pegue la respuesta incorrecta, pero usaré la suya. :)
1
@TorThommesen: puede editar el título de su Q si no es correcto.
slm
0

Como nadie más lo mencionó, también puede usarlo egrep, que, según tengo entendido, es equivalente a grep -E.

egrep ':[[:alnum:]]{1,100}:' ~/x.txt
sherrellbc
fuente
1
egrepfue el comando histórico de grep con ERE. La funcionalidad de grep y egrep se ha fusionado (hace mucho tiempo) en grep con la opción -E. egrepahora se considera obsoleto / en desuso (pero es poco probable que pase, ya que algunas personas todavía están acostumbradas).
Stéphane Chazelas