Регулярное выражение для совпадения только X символов с конца строки

Ниже вы увидите небольшой отрывок совпадений из строки 'octeon' в дампе памяти объемом 32 байта, полученном от проприетарного устройства маршрутизации. Как вы можете видеть, он содержит несколько скорректированных символов ASCII, расширяющихся до 16 символов от конца строки, затем четыре 32-битных слова (конечно, по 8 символов в каждом) и смещение адреса.

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:

Хотя эти данные содержат некоторую полезную информацию, к сожалению, операционная система (HiveOS) не пытается выделять память непрерывно или объединять разрозненные кучи (да и зачем?), поэтому подавляющее большинство память — это бесплодная куча, которую еще предстоит выделить.

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    ................

Я хотел бы быстро и эффективно извлекать строки определенного размера, соответствующие некоторому произвольному шаблону регулярного выражения (на ум приходит [a-zA-z]) Вы могли бы, естественно, подумать, что выполнение многолетнего анализа дампа объектов даст результат, но утилита md— жестокая хозяйка — из-за наличия ASCII-кодированных шестнадцатеричных банков и адресов она идентифицирует каждая строка содержит «строку».

Конечно, все мы знаем, что существует тривиальное скриптовое решение ( для строки в шестнадцатеричном дампе: f.write(line[-16:])+ grep '[Az]' f).

Тем не менее, иногда меня поражает чувство, что я должен лучше понять эти подлые угнетающие, но неправильно понятые регулярные выражения, а не возвращаться к моим простым в использовании новомодным языкам программирования. Я действительно чувствую, что не смогу начать выращивать настоящую бороду Unix, пока полностью не заменю всю свою набор инструментов разработкиразличными потоковыми редакторами и регулярными выражениями сценариев Awk.

Как сопоставить [a-zA-z]в пределах определенного количества символов от конца строки (в моем случае 16) — это кажется довольно содержательной конструкцией, но все комбинации +, ? {16} и в остальном, что имело смысл для меня в последние несколько минут, быстро потерпели неудачу.

8
задан TLS 15 March 2012 в 18:20
поделиться