如何在Vim的十六进制模式下跨行搜索指定文本字符串?
在Vim十六进制模式中搜索跨行文本字符串
Vim自带的xxd转换模式确实没法直接搜索跨行的原始文本——因为转成十六进制后内容被拆成了固定宽度的行。不过有两种自带解法,也可以用插件简化操作:
自带方案一:切回普通模式搜完再转回去
不用装插件,步骤很简单:
- 先敲
%!xxd -r把文件转回到普通文本模式 - 用常规搜索
/1111111111111定位到目标字符串 - 再敲
%!xxd切回十六进制模式,光标会停在对应的位置
自带方案二:构造跨行的十六进制正则
目标字符串"1111111111111"对应的十六进制是31重复13次。看你提供的xxd输出,前10个31在第一行末尾,剩下3个在第二行开头,直接写跨行正则就能匹配:
- 执行搜索:
/31\{10\}\n\s*31\{3\} - 拆解一下:
31\{10\}匹配第一行的10个"1",\n匹配换行,\s*跳过第二行开头的空格,31\{3\}匹配剩下的3个"1"
要是不想手动数个数,也可以用Vim的表达式自动生成匹配规则:
- 先把目标字符串存到寄存器,比如光标在字符串上时敲
"ayiw - 然后执行搜索:
/\=printf('%02X', char2nr(getreg('a')[0])).'\{'..strlen(getreg('a'))..'\}',这个命令会把寄存器里的文本转成对应的十六进制重复模式,再根据跨行情况微调就行
插件方案
如果经常要做这种操作,可以装vim-hexokinase插件,它支持在十六进制视图里直接输入原始文本搜索,自动处理跨行匹配,不用自己写正则。
内容的提问来源于stack exchange,提问作者kgflying
相关产品推荐
相关产品推荐

