2013-08-24 191 views
2

我試圖從Linux Make文件中提取目標文件。下面是一些例子:Perl正則表達式:與可選多行匹配文本

英特爾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 

Chelsio的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 

Atheros的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); 

回答

1

你可以用這個嘗試:

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

這將是屬於所有對象文件捕捉到一定$obj_files_no_ext組1

+0

$ obj_files_no_ext是一個變量。我試圖編輯帖子以刪除第一個\但我需要更改至少6個字符。 –

+0

@PeterSenna我不明白,你能解釋一下嗎? –

+0

'$ obj_files_no_ext'是一個變量,在這個例子中OP的正則表達式實際上會被'e1000'替代。 – Jerry

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); 
+0

在我的測試是隻返回的是前第一\在一些文件中也可能有多於一行以e1000e-objs + =開頭,這就是我使用($ str =〜m /.../ g)的原因。模式細節非常具有指導性。謝謝。 –

+0

@PeterSenna:是的,因爲(正如你可以在示例代碼中看到的那樣),我假設斜槓在這裏僅僅是爲了說明有新行,而不是真的在這裏。奇怪的是,這些斜線在你的數據中,或許你可以避免這種情況? –

+1

@PeterSenna:如果你想要,你可以用'\ G \ s * \\?'來代替'\ G'來糾正這個問題。 –