Mi cadena de ejemplo es la siguiente:
This is 02G05 a test string 20-Jul-2012Ahora 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
\dposible 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.2G05no02G05. 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 sussedapoyos\?para cero o una ocurrencia)\w,\s, etc.¿Qué tal usar
grep -E?fuente
sedpodría idear un guión complejo para ese caso, pero ¿para qué molestarse?egrepPosibilidades de ampliar expresión regular,sedygreputiliza expresiones regulares estándar,egrepogrep -eosed -Eusan 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-Popción.egrepogrep -Eosed -rgreptiene-m 1que parar después del primer partido.sedno reconoce\d, use[[:digit:]]en su lugar. También necesitará escapar+o usar el-rinterruptor (-Een 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
\dson completamente superfluos.