Mi cadena de ejemplo es la siguiente:
This is 02G05 a test string 20-Jul-2012
Ahora de la cadena de arriba 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 anteriores con python, obtengo mi resultado
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
sed
. Sus sabores de expresiones regulares son bastante diferentes.Respuestas:
Es
\d
posible que el patrón no sea compatible con sused
. Prueba[0-9]
o en su[[:digit:]]
lugar.Para imprimir solo la coincidencia real (no toda la línea coincidente), utilice una sustitución.
fuente
.*
es necesario con su expresión regular porque cuando lo intentosed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'
solo imprime la línea completa.2G05
no02G05
. La expresión que funciona es's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'
sería más general. (Asumo sussed
apoyos\?
para cero o una ocurrencia)\w
,\s
, etc.¿Qué tal usar
grep -E
?fuente
sed
podría idear un guión complejo para ese caso, pero ¿para qué molestarse?egrep
Posibilidades de ampliar expresión regular,sed
ygrep
utiliza expresiones regulares estándar,egrep
ogrep -e
osed -E
usan expresión regular extendida, y el código Python en la pregunta utiliza PCRE, (Perl expresiones regulares común) GNU grep puede utilizar PCRE con-P
opción.egrep
ogrep -E
osed -r
grep
tiene-m 1
que parar después del primer partido.sed
no reconoce\d
, use[[:digit:]]
en su lugar. También necesitará escapar+
o usar el-r
interruptor (-E
en OS X).Tenga en cuenta que
[0-9]
funciona también para números arábigos-hindúes.fuente
sed -n '/[0-9]\+G[0-9]\+/p'
. Ahora solo imprime la cadena completaPrueba esto en su lugar:
Pero tenga en cuenta que si hay dos patrones en una línea, imprimirá el segundo.
fuente
Intente usar rextract . Le permitirá extraer texto usando una expresión regular y reformatearlo.
Ejemplo:
fuente
\d
son completamente superfluos.