Regex Grep:只查找一次与未知字符匹配的行
我有一个十六进制行的列表。例如:Regex Grep:只查找一次与未知字符匹配的行,regex,grep,Regex,Grep,我有一个十六进制行的列表。例如: 0b 5a 3f 5a 7d d0 5d e6 2b c4 7e 7d c2 c0 e6 9a 84 bd aa 74 f3 85 da 9d ac b6 e0 b6 62 0f b5 d5 c0 b0 f5 60 02 8b 1c a4 41 7c 53 f2 85 20 a0 d1 ... 我试图找到grep的所有行,其中有一个字符在行中只出现一次 例如:第三行中只有一次a'd' 我试过这个,但不起作用: egrep '^.*([a-f0-9])[^\1
0b 5a 3f 5a 7d d0 5d e6 2b c4 7e 7d c2 c0 e6 9a
84 bd aa 74 f3 85 da 9d ac b6 e0 b6 62 0f b5 d5
c0 b0 f5 60 02 8b 1c a4 41 7c 53 f2 85 20 a0 d1
...
我试图找到grep的所有行,其中有一个字符在行中只出现一次
例如:第三行中只有一次a'd'
我试过这个,但不起作用:
egrep '^.*([a-f0-9])[^\1]*$'
我不知道用正则表达式怎么做。但是,您可以使用这个愚蠢的
awk
脚本:
awk -F '' '{for(i=1;i<=NF;i++){a[$i]++};for(i in a){if(a[i]==1){print;next}}}' input
awk-F''{for(i=1;i这里有一段代码,它使用了grep
之外的许多shell工具。
它逐行读取输入。生成一个频率表。当找到频率为1的元素时,它输出唯一字符和整行
cat input | while read line ; do
export line ;
echo $line | grep -o . | sort | uniq -c | \
awk '/[ ]+1[ ]/ {print $2 ":" ENVIRON["line"] ; exit }' ;
done
请注意,如果您只对数字感兴趣,则可以将grep-o.
替换为grep-o“[a-f]”
这可以用正则表达式完成,但必须是详细的。
这有点不可能一概而论
# ^(?:[^a]*a[^a]*|[^b]*b[^b]*|[^c]*c[^c]*|[^d]*d[^d]*|[^e]*e[^e]*|[^f]*f[^f]*|[^0]*0[^0]*|[^1]*1[^1]*|[^2]*2[^2]*|[^3]*3[^3]*|[^4]*4[^4]*|[^5]*5[^5]*|[^6]*6[^6]*|[^7]*7[^7]*|[^8]*8[^8]*|[^9]*9[^9]*)$
^
(?:
[^a]* a [^a]*
| [^b]* b [^b]*
| [^c]* c [^c]*
| [^d]* d [^d]*
| [^e]* e [^e]*
| [^f]* f [^f]*
| [^0]* 0 [^0]*
| [^1]* 1 [^1]*
| [^2]* 2 [^2]*
| [^3]* 3 [^3]*
| [^4]* 4 [^4]*
| [^5]* 5 [^5]*
| [^6]* 6 [^6]*
| [^7]* 7 [^7]*
| [^8]* 8 [^8]*
| [^9]* 9 [^9]*
)
$
对于发现,如果在字母和数字周围放置捕获组,
并使用支路复位:
^
(?|
[^a]* (a) [^a]*
| [^b]* (b) [^b]*
| [^c]* (c) [^c]*
| [^d]* (d) [^d]*
| [^e]* (e) [^e]*
| [^f]* (f) [^f]*
| [^0]* (0) [^0]*
| [^1]* (1) [^1]*
| [^2]* (2) [^2]*
| [^3]* (3) [^3]*
| [^4]* (4) [^4]*
| [^5]* (5) [^5]*
| [^6]* (6) [^6]*
| [^7]* (7) [^7]*
| [^8]* (8) [^8]*
| [^9]* (9) [^9]*
)
$
这是输出:
** Grp 0 - ( pos 0 , len 50 )
0b 5a 3f 5a 7d d0 5d e6 2b c4 7e 7d c2 c0 e6 9a
** Grp 1 - ( pos 7 , len 1 )
f
-----------------------
** Grp 0 - ( pos 50 , len 51 )
84 bd aa 74 f3 85 da 9d ac b6 e0 b6 62 0f b5 d5
** Grp 1 - ( pos 77 , len 1 )
c
-----------------------
** Grp 0 - ( pos 101 , len 51 )
c0 b0 f5 60 02 8b 1c a4 41 7c 53 f2 85 20 a0 d1
** Grp 1 - ( pos 148 , len 1 )
d
您是指任何字符只出现一次的所有行?或者某个字符只出现一次的所有行?如果是后者,您可以使用egrep'^[^d]*d[^d]*$以获得只有一个d的所有行。任何字符出现的所有行只有一个。我认为此解决方案不可行。我来自德国,ß
?我的意思是此解决方案不适用于世界上大多数文本输入数据,但适用于mac地址;)@hek2mgl-除了以有限的详细方式外,不太实用。它就是这样。我再次思考了这个问题……我想说的是,一般问题的答案是:“任何字符只出现一次的所有行。”只有当字符集被限制为正则表达式可处理的内容时,它才是可解的(我不知道模式长度的限制,但我猜有一些限制)。这意味着对于unicode来说可能是不可能的。但是,您的回答表明,确实有可能使用有限的字符集,特别是对于mac地址作为输入数据。最后一个好的回答是imo+1