2

我正在尝试从 Linux Make 文件中提取目标文件。这里有些例子:

英特尔 E1000E:

e1000e-objs := 82571.o ich8lan.o 80003es2lan.o \
       mac.o manage.o nvm.o phy.o \
       param.o ethtool.o netdev.o ptp.o

切尔西T3:

cxgb3-objs := cxgb3_main.o ael1002.o vsc8211.o t3_hw.o mc5.o \
       xgmac.o sge.o l2t.o cxgb3_offload.o aq100x.o

创锐讯 ALX:

alx-objs := main.o ethtool.o hw.o

考虑到多行是可选的并且可能多于两行,我如何制作一个返回 := 之后的内容的正则表达式?请注意,反斜杠是 Makefile 内容的一部分。

我只知道如何手动指定新行的数量,例如:

$obj_files_no_ext = "e1000";
my @filestmp = ($Makefile_contents =~ m/$obj_files_no_ext-objs\s*[\+\:]= (.*)\\\s*\n(.*)/g);
4

2 回答 2

2

你可以试试这个模式:

(?>$obj_files_no_ext-objs\s*:=|\G)\s*\K(?>[^\s.]++|\.(?!o(?:\s|$)))++\.o

图案细节:

(?>                    # open an atomic group
    $obj_files_no_ext  # radical
    -objs\s*:=         
  |                    # OR
    \G                 # contiguous match
)                      # close the atomic group
\s*\K                  # optional spaces and reset all the match
(?>                    # open an atomic group (filename possible characters)
    [^\s.]++           # all that is not a white character or a dot (1+ times)
  |                    # OR
    \.(?!o(?:\s|$))    # a dot not followed by "o", a space or the string end 
)++                    # repeat the atomic group one or more times
\.o           

例子:

#!/usr/bin/perl
use strict;
use warnings;

my $Makefile_contents = q{e1000e-objs := 82571.o ich8lan.o 80003es2lan.o 
   mac.o manage.o nvm.o phy.o 
   param.o ethtool.o netdev.o ptp.o};

my $obj_files_no_ext = "e1000e";
my $reg = qr/(?>$obj_files_no_ext-objs\s*:=|\G)\s*\K(?>[^\s.]++|\.(?!o(?:\s|$)))++\.o/;
my @filestmp =  $Makefile_contents =~ /$reg/g;
print join(" ",@filestmp);
于 2013-08-24T11:25:36.307 回答
1

你可以试试这个:

$obj_files_no_ext-objs\s*:=\s*((?:(?:[^\s\\]*?\.o)[\s\n\r\\]*)+)

这将捕获属于$obj_files_no_ext组 1 中某个特定对象的所有目标文件。

于 2013-08-24T11:27:29.113 回答