You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求匹配[a-f0-9]中每个字符恰好出现2次的grep正则表达式

使用grep匹配每个十六进制字符恰好出现2次的行

需求说明

需要编写grep正则表达式,筛选出文件中满足以下条件的行:

  • 仅包含十六进制字符(a-f0-9)和空格(作为两位字符组的分隔符)
  • 每个十六进制字符(0-9a-f)在整行中恰好出现2次

有效匹配示例

33 e0 f1 76 9c 4f a8 6c 01 5d 45 9e 28 db 7b 2a

无效匹配示例

c0 b0 f5 60 02 8b 1c a4 41 7c 53 f2 85 20 a0 d1

(无效原因:字符0出现次数超过2次)

问题分析

你尝试的正则'(?:[0-9a-f])?^[^\1]*\1[^\1]*\1[^\1]*$'无法生效,主要有两个问题:

  1. 反向引用\1没有对应的捕获组,(?:[0-9a-f])是非捕获组,无法被引用
  2. 字符集[^\1]的写法错误,字符集内不能使用反向引用,这里实际是匹配除了ASCII控制字符SOH(\x01)之外的所有字符,并非排除捕获组匹配的内容

解决方案

使用GNU grep的PCRE模式(-P参数),通过正向预查确保每个十六进制字符恰好出现2次,同时限制行的结构为16组两位十六进制数:

grep -P '^(?=(?:[^0]*0){2}[^0]*$)(?=(?:[^1]*1){2}[^1]*$)(?=(?:[^2]*2){2}[^2]*$)(?=(?:[^3]*3){2}[^3]*$)(?=(?:[^4]*4){2}[^4]*$)(?=(?:[^5]*5){2}[^5]*$)(?=(?:[^6]*6){2}[^6]*$)(?=(?:[^7]*7){2}[^7]*$)(?=(?:[^8]*8){2}[^8]*$)(?=(?:[^9]*9){2}[^9]*$)(?=(?:[^a]*a){2}[^a]*$)(?=(?:[^b]*b){2}[^b]*$)(?=(?:[^c]*c){2}[^c]*$)(?=(?:[^d]*d){2}[^d]*$)(?=(?:[^e]*e){2}[^e]*$)(?=(?:[^f]*f){2}[^f]*$)(?:[0-9a-f]{2}(?: |$)){16}$' 文件名

正则解释

  1. 正向预查部分:每个(?=(?:[^x]*x){2}[^x]*$)用于确保字符x在整行中恰好出现2次:
    • (?:[^x]*x)匹配任意非x字符后接一个x
    • {2}表示该模式恰好出现2次
    • [^x]*$确保之后没有更多的x字符
  2. 行结构部分:(?:[0-9a-f]{2}(?: |$)){16}$确保行由16组两位十六进制数组成,每组之间用空格分隔,行尾无多余空格

如果不需要严格限制两位组的结构,只要求去掉空格后每个字符恰好出现2次,可简化为:

grep -P '^(?=(?:[^0]*0){2}[^0]*$)(?=(?:[^1]*1){2}[^1]*$)(?=(?:[^2]*2){2}[^2]*$)(?=(?:[^3]*3){2}[^3]*$)(?=(?:[^4]*4){2}[^4]*$)(?=(?:[^5]*5){2}[^5]*$)(?=(?:[^6]*6){2}[^6]*$)(?=(?:[^7]*7){2}[^7]*$)(?=(?:[^8]*8){2}[^8]*$)(?=(?:[^9]*9){2}[^9]*$)(?=(?:[^a]*a){2}[^a]*$)(?=(?:[^b]*b){2}[^b]*$)(?=(?:[^c]*c){2}[^c]*$)(?=(?:[^d]*d){2}[^d]*$)(?=(?:[^e]*e){2}[^e]*$)(?=(?:[^f]*f){2}[^f]*$)[0-9a-f ]+$'

内容的提问来源于stack exchange,提问作者mister entername

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:41