我想使用 sed 中的正则表达式模式来匹配固定长度的十六进制地址。例如:
0x000000010b2e993c
0x
始终存在,后跟十六个字符的十六进制数字。这是成功的:
's/0x[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]//'
有没有一种速记方法可以让我使用0x
then[0-9a-f]
出现十六次?
答案1
sed 's/0[xX][[:xdigit:]]\{16\}//g'
是带有基本正则表达式的标准语法。
大多数sed
实现现在都支持-E
切换到的选项扩展正则表达式¶:
sed -E 's/0[xX][[:xdigit:]]{16}//g'
[[:xdigit:]]
等价于[0123456789abcdefABCDEF]
(不一定[0-9a-fA-F]
可以匹配数百个恰好在 0 和 9、a 和 f 或 A 和 F 之间排序的其他字符)。
无论如何,请注意 确实0x01234567890123456789
包含0x0123456789012345
,因此将被替换为6789
。
0x<16-hex-digits>
仅当后面没有其他十六进制数字时才进行替换,您可以使用perl
:
perl -pe 's/0x[0-9a-f]{16}(?![0-9a-f])//gi'
(?!...)
负前瞻断言运算符在哪里通常在受支持的正则表达式中不可用sed
(ast-opensed
是一个例外)。无论区域设置如何,仅匹配 0123456789 和 abcdef,但如果您愿意,也可以在perl
[0-9]
那里使用。[a-f]
[[:xdigit:]]
更多sed
实施支持字边界运算符,但语法因实现而异:
\b
像perl
\<
,\>
像ex
/vi
[[:<:]]
,[[:>:]]
在某些 BSD 上
某些sed
实现还支持i
orI
标志以使匹配不区分大小写,例如perl
.使用 GNU sed
:
sed -E 's/0x[[:xdigit:]]{16}\b//gi'
喜欢:
perl -pe 's/0x[0-9a-f]{16}\b//gi'
将删除后面0x<16-hex-digits>
跟着的单词边界,前提是后面的不是单词字符(数字或下划线)。
最初,基本正则表达式和扩展正则表达式都没有\{x[,y]\}
/{x[,y]}
运算符。为了保持一致性\{...\}
,首先添加到 BRE,然后{...}
添加到 ERE(由 POSIX 推动),但通常很不情愿,因为它破坏了向后兼容性(与之前未指定行为的 BRE 相反\{...\}
),并且您会发现某些awk
或egrep
实现仍然不这样做不支持。