regex - regulares - expresion regular solo numeros mayores que 0
Expresión regular para solo coincidir X número de caracteres desde el final de la línea (3)
¿Hace esto lo que quieres? " .{16}$
"
Eso coincidirá con 16 caracteres del final de la línea. El $
asegura que coincide con el final de la línea.
Después de una inspección más cercana, si desea extraer solo las líneas que no son todos los puntos, podría usar esta expresión regular: " {4}(.*?/w.*?)$
" Hay un espacio antes del {4}
modo que coincida con el delimitador entre los dígitos y el final de la línea. No es técnicamente "solo 16 caracteres", pero dado el conjunto de datos, parece proporcionar el resultado deseado. (Suponiendo que el resultado deseado es cualquier línea que tenga un carácter de palabra, que es letras / números / guión bajo).
A continuación, verá un pequeño extracto de coincidencias de la cadena ''octeon'' en un volcado de memoria 32b desde un dispositivo de enrutamiento patentado. Como puede ver, contiene algunos ASCII ajustados que se extienden a 16 caracteres del final de la línea, luego cuatro palabras de 32 bits (8 caracteres cada uno, por supuesto), luego el desplazamiento de la dirección.
000b27a0: 41646a75 7374206f 6374656f 6e5f6970 Adjust octeon_ip
000b2850: 73740a00 00000000 6f637465 6f6e5f72 st......octeon_r
000b2870: 5f73697a 65000000 6f637465 6f6e5f72 _size...octeon_r
000b2990: 6164696e 672e0a00 6f637465 6f6e5f72 ading...octeon_r
000b29b0: 785f7369 7a650000 6f637465 6f6e5f72 x_size..octeon_r
000b3050: 780a0000 00000000 6f637465 6f6e5f70 x.......octeon_p
000b3650: 6564204f 6374656f 6e206d6f 64656c0a ed Octeon model.
000bade0: 20307825 71780a00 6f637465 6f6e5f6c 0x%qx..octeon_l
000bafd0: 696e6720 4f637465 6f6e2045 78656375 ing Octeon Execu
000bd710: 6564204f 6374656f 6e204d6f 64656c21 ed Octeon Model!
000bd950: 4f435445 4f4e2070 61737320 3120646f OCTEON pass 1 do
000bda20: 6564206f 6374656f 6e206d6f 64656c3a ed octeon model:
Si bien esos datos contienen cierta información útil, trágicamente, el sistema operativo ( HiveOS ) no intenta asignar memoria de forma contigua o unir montones dispares (¿y por qué deberían hacerlo?), Por lo que la gran mayoría de la memoria es un estéril aún por nacer . -malloc''d montón.
0004d6b0: 00000000 00000000 00000000 00000000 ................
0004d6c0: 00000000 00000000 00000000 00000000 ................
0004d6d0: 00000000 00000000 00000000 00000000 ................
0004d6e0: 00000000 00000000 00000000 00000000 ................
0004d6f0: 00000000 00000000 00000000 00000000 ................
0004d700: 00000000 00000000 00000000 00000000 ................
0004d710: 00000000 00000000 00000000 00000000 ................
0004d720: 00000000 00000000 00000000 00000000 ................
0004d730: 00000000 00000000 00000000 00000000 ................
0004d740: 00000000 00000000 00000000 00000000 ................
0004d750: 00000000 00000000 00000000 00000000 ................
Me gustaría extraer de forma rápida y eficiente cadenas de cierto tamaño que coincidan con algún patrón de expresión regular arbitrario ( [a-zA-z]
viene a la mente). Es posible que piense que ejecutar el perenne objeto dump exam favorito ''cadenas'' produciría un resultado, pero el md
util es una amante cruel: debido a la presencia de bancos y direcciones hexadecimales codificados ascii, identifica cada línea como si contuviera una ''cadena''.
Claro, todos sabemos que existe una solución trivial de scripting ( for line in hexdump: f.write(line[-16:])
+ grep ''[Az]'' f
).
Sin embargo, a veces me impacta la sensación de que debería entender mejor estas expresiones cobardes y opresivas, aunque incomprendidas, en lugar de volver a utilizar mis nuevos lenguajes fáciles de usar. Realmente siento que no puedo empezar a cultivar un cuello de botella real de Unix hasta que haya reemplazado por completo toda mi vida útil de cadena de herramientas de desarrollo con varias expresiones regulares del editor de flujo y del script Awk.
¿Cómo se empareja [a-zA-z]
con un cierto número de caracteres desde el final de la línea (en mi caso, 16)? Parece una construcción bastante concisa pero con toda la combinación de +,? {16} y, de lo contrario, eso tenía sentido para mí en los últimos minutos han fallado rápidamente.
Un truco barato para filtrar líneas interesantes es completar la selección con cualquier personaje hasta el final de la línea. Aquí selecciono un personaje que no es un punto y que no tiene más de 15 caracteres desde el final de la línea. (Utiliza posix regex, por lo que debe escribir el cuantificador de repetición entre / {/} y no {})
grep ''[^.]./{1,15/}$''
Luego puede conectar el resultado con otra grep para probar, o puede adaptar la idea a otra expresión regular:
grep ''abc./{1,13/}$''
Mapeará "abc" en los últimos 16 caracteres.
Use el interruptor "no coincidente" -v
:
grep -v /.{16}$
Esto eliminará todas las líneas que terminen con 16 puntos.
Aquí está la documentación del man
:
-v, --invert-match
Invierte el sentido de coincidencia, para seleccionar líneas que no coincidan.