sed 中的正则表达式模式匹配固定长度的十六进制地址

sed 中的正则表达式模式匹配固定长度的十六进制地址

我想使用 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]//'

有没有一种速记方法可以让我使用0xthen[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实施支持字边界运算符,但语法因实现而异:

  • \bperl
  • \<\>ex/vi
  • [[:<:]],[[:>:]]在某些 BSD 上

某些sed实现还支持iorI标志以使匹配不区分大小写,例如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 相反\{...\}),并且您会发现某些awkegrep实现仍然不这样做不支持。

相关内容