¿Cómo extraer texto de una cadena usando sed?

Mi cadena de ejemplo es la siguiente:

This is 02G05 a test string 20-Jul-2012 

Ahora de la cadena anterior quiero extraer 02G05 . Para eso probé la siguiente expresión regular con sed

 $ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p' 

Pero el comando anterior no imprime nada y la razón por la que creo es que no puede hacer coincidir nada con el patrón que proporcioné a sed.

Entonces, mi pregunta es qué estoy haciendo mal aquí y cómo corregirlo.

Cuando pruebo la cadena y el patrón de arriba con python obtengo mi resultado

 >>> re.findall(r'\d+G\d+',st) ['02G05'] >>> 

El patrón \d podría no ser compatible con tu sed . Pruebe [0-9] o [[:digit:]] lugar.

Para imprimir solo la coincidencia real (no toda la línea correspondiente), use una sustitución.

 sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p' 

¿Qué hay de usar egrep ?

 echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+' 

sed no reconoce \d , usa [[:digit:]] lugar. También necesitará escapar del + o usar el -r ( -E en OS X).

Tenga en cuenta que [0-9] funciona también para los números árabe-hindúes.

Pruebe esto en su lugar:

 echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/' 

Pero tenga en cuenta que si hay dos patrones en una línea, se imprimirá el 2do.

Intenta usar rextract . Le permitirá extraer texto usando una expresión regular y reformatearlo.

Ejemplo:

 $ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}' 2G05