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
-o
y-P
son extensiones de GNU paragrep
.-o
funciona también en los BSD. El soporte PCRE con-P
no siempre se compila tampoco.Use
egrep
con-o
ogrep
con la-Eo
opció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
grep
con PCRE recientes y haga coincidir los números después deID:
:Use
awk
e 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
\K
está haciendo en el primer ejemplo?-o
para 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: 54376
en cualquier entrada de archivo.Acabo de actualizar un poco lo anterior para hacerlo un poco más rápido
*
y nop
eliminar 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 nop
borra/
ninguna/
línea con un.
carácter restante.MANIFESTACIÓN:
SALIDA:
fuente
Usando sed:
El
-n
es "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: //p
es de la formas/pattern/repl/flags
-s
significa que estás haciendo un sustituto, para reemplazar el patrón"ID: "
con texto de reemplazo""
(cadena vacía) usando lap
bandera, 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 todassed
s 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
grep
si 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.