gpt4 book ai didi

regex - 使用 Perl 提取内容

转载 作者:行者123 更新时间:2023-12-04 18:18:49 25 4
gpt4 key购买 nike

我想用 Perl 编写一个解析脚本,从这些数据中打印出所有的“接口(interface)名称”:

interfaces.ifTable.ifEntry.ifDescr.1 : OCTET STRING- (ascii): (hex): length = 30
0: 53 6f 66 74 77 61 72 65 20 4c 6f 6f 70 62 61 63 Software Loopbac
16: 6b 20 49 6e 74 65 72 66 61 63 65 20 31 00 -- -- k Interface 1...

interfaces.ifTable.ifEntry.ifDescr.2 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 53 53 WAN Miniport (SS
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............

interfaces.ifTable.ifEntry.ifDescr.3 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 4c 32 WAN Miniport (L2
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............

我想提取所有三个接口(interface)的名称,如(“Sotware Loopback Interface 1”、“WAN Miniport (SSTP)”、“WAN Miniport (L2TP)”),并做进一步处理。我尝试使用正则表达式但没有运气。有什么简单的方法可以做到这一点吗?提前致谢!

最佳答案

这是另一个肮脏的 perl 脚本。根据需要将数据读入 $text 。正则表达式查找每个十六进制转储行的模式。然后,连接行将十六进制值重新组合回字符串,并将其附加到当前累积的接口(interface)名称中。 mttrb 更简单。 ;)

$text =<<EOM;
interfaces.ifTable.ifEntry.ifDescr.1 : OCTET STRING- (ascii): (hex): length = 30
0: 53 6f 66 74 77 61 72 65 20 4c 6f 6f 70 62 61 63 Software Loopbac
16: 6b 20 49 6e 74 65 72 66 61 63 65 20 31 00 -- -- k Interface 1...

interfaces.ifTable.ifEntry.ifDescr.2 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 53 53 WAN Miniport (SS
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............

interfaces.ifTable.ifEntry.ifDescr.3 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 4c 32 WAN Miniport (L2
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
EOM

$interface = "";
foreach $line (split(/\n/, $text)) {
next unless $line =~ /\b(\d+):\s+((?:[0-9a-fA-F-]{2} ){16})/;
if ($1 == 0) {
print "$interface\n" if $interface;
$interface = "";
}
$interface .= join('', map { chr(hex($_)) } grep { $_ ne '--' && $_ ne '00' } split(/ /, $2));
}
print "$interface\n" if $interface;

为了解释连接线,该线发生了以下事情。
  • split(//, $2) - 从正则表达式中取出第二个保存的组,即十六进制字符,并将其拆分为包含每对数字的数组。
  • grep { $_ ne '--' && $_ ne '00' } - 查看数字对数组并过滤掉 '--' 和 '00' 条目,只留下有效值。
  • map { chr(hex($)) } - 对每个过滤的对运行表达式,$ 是正在处理的对。 Hex 将其从 hex() 字符串解析为数字,然后 chr() 获取该数字并将其转换为相应的字符。
  • join('', ...) - 接收 map 创建的字符数组并从中创建单个字符串。 '' 是分隔每个数组项的字符串,在这种情况下什么都没有。
  • 关于regex - 使用 Perl 提取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11149928/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com