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