在Vim或其他地方使用正则表达式进行搜索

时间:2011-06-20 20:12:22

标签: regex search vim binary hex

我正在寻找一种搜索一系列十六进制数字的文本表示的方法。我搜索二进制文件的十六进制转储。

0x000001A0: 36 5B 09 76 99 31 55 09 78 99 34 51 49 BF E0 03
0x000001B0: 28 0B 0A 03 0B E0 07 28 0B 0A 03 0B 49 58 09 35

问题是模式可能会翻到下一行。例如,在上面的两行中,我无法立即搜索03 28 0B,因为它位于两行。

我从最近的帖子中得知,正则表达式是可行的,但我不熟悉它并且不知道该使用什么:Notepad ++,Vim,Word或其他任何东西。

编辑1 显示上述内容的文本文件来自二进制文件,我可以使用Notepad ++。

编辑2 例如,我想尽可能接近11:45:00(军事时间)。分散在上面两行的03 28 0B 0A 03 0B可以读作“2011年3月10日的3秒,40分钟,11小时”。我正在查看这个文件,看看我能到达11:45:00的距离。

3 个答案:

答案 0 :(得分:1)

好吧,似乎没有一个更优雅的解决方案适合你,所以:

\v03(\n[^:]+:)? 28(\n[^:]+:)? 0B(\n[^:]+:)?

是的,它是复制粘贴和超级暴力的,但如果我能让friggin反向引用工作,它看起来会好得多。

只需键入'/'然后复制该模式并按Enter键,将03 28 0B替换为您需要的任何内容,后跟空格,新值,然后是括号语句。有大约100%的机会有更好的东西,但我想不到它。

这也会匹配内存位置,但如果你想做的就是看一眼就不重要了。

编辑:忘记了\ v

答案 1 :(得分:0)

您可以使用具有内置HEX编辑器和HEX搜索功能的PSPad。只需打开原始二进制文件,切换到HEX编辑器并搜索序列。

答案 2 :(得分:0)

让我提出以下映射,其中包含多个十六进制数字 用户输入或视觉选择,创建适当的模式并运行搜索 它

nnoremap <silent> <expr> <leader>x/ SearchHexBytes('/', 0)
nnoremap <silent> <expr> <leader>x? SearchHexBytes('?', 0)
vnoremap <silent> <leader>x/ :call SearchHexBytes('/', 1)<cr>/<cr>
vnoremap <silent> <leader>x? :call SearchHexBytes('?', 1)<cr>?<cr>
function! SearchHexBytes(dir, vis)
    if a:vis
        let [qr, qt] = [getreg('"'), getregtype('"')]
        norm! gvy
        let s = @"
        call setreg('"', qr, qt)
    else
        call inputsave()
        let s = input(a:dir)
        call inputrestore()
    endif
    if s =~ "[^ \t0-9A-Fa-f]"
        echohl Error | echomsg 'Invalid hex digits' | echohl None
        return
    endif
    let @/ = join(split(s, '\s\+'), '\%(\s*\|\n0x\x\+:\s*\)')
    return a:dir . "\r"
endfunction