Entonces tengo una línea:
ID: 54376
¿Me pueden ayudar a hacer una expresión regular que solo devolvería números sin "ID:"?
NOTA: esta cadena está en un archivo.
text-processing
regular-expression
Blake Gibbs
fuente
fuente

-oy-Pson extensiones de GNU paragrep.-ofunciona también en los BSD. El soporte PCRE con-Pno siempre se compila tampoco.Use
egrepcon-oogrepcon la-Eoopción para obtener solo el segmento coincidente. Use[0-9]como expresión regular para obtener solo números:fuente
Hay muchas formas de hacer esto. Por ejemplo:
Use GNU
grepcon PCRE recientes y haga coincidir los números después deID::Use
awke imprima el último campo de todas las líneas que comienzan conID:Sin embargo, eso también imprimirá campos que no son números, para obtener solo números, y solo en el segundo campo, use
Use GNU grep con Expresiones regulares extendidas y analícelo dos veces:
fuente
\Kestá haciendo en el primer ejemplo?-opara imprimir solo la parte coincidente pero también descartar cosas que no me interesan. Compararecho "foobar" | grep -oP "foobar"yecho "foobar" | grep -oP 'foo\Kbar'Eso imprimirá solo todos los números y espacios que ocurran después
ID: 54376en cualquier entrada de archivo.Acabo de actualizar un poco lo anterior para hacerlo un poco más rápido
*y nopeliminar líneas en blanco después de eliminar los caracteres que no son {numéricos, espacio}.Aborda las líneas desde la expresión regular
/ID: 54376/,hasta la$última y en ellass///elimina todos los*caracteres o^no,[^ 0-9]*luego nopborra/ninguna/línea con un.carácter restante.MANIFESTACIÓN:
SALIDA:
fuente
Usando sed:
El
-nes "no imprime nada por defecto",/^ID: [0-9][0-9]*$/es "para líneas que coinciden con esta expresión regular" (comienza con "ID:", luego 1 o más dígitos, luego final de línea), y els/ID: //pes de la formas/pattern/repl/flags-ssignifica que estás haciendo un sustituto, para reemplazar el patrón"ID: "con texto de reemplazo""(cadena vacía) usando lapbandera, que significa "imprimir esta línea después de hacer la sustitución".Salida:
fuente
Otro comando de GNU sed,
Imprime cualquier número después
ID:fuente
+. Si la diferencia entre un personaje y 3 caracteres es la secuencia de comandos no funcionen en todasseds probablemente debería hacer:sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'. Su respuesta también pierde el primeroID: [0-9]en una línea que contiene dos ocurrencias deID: [0-9].Use grep + awk:
Bono: fácil de leer :)
fuente
grepsi lo estás usandoawk.awk '/^ID/ { print $2 }'hace lo mismo y evita los problemas de almacenamiento en línea de grep . También es más o menos lo mismo que una de las soluciones en la respuesta de @terdon.