2011-05-10 54 views
4

選擇,我想搜索文件中的一個模式,我可以很容易地像做:當我發現這個第一圖案Powershell的先進的正則表達式從文件

 
gc $filename | select-string $pattern 

但是,使用位置(線)第一場比賽作爲一個起點,然後我想開始尋找第二個模式。一旦第二個模式匹配了,我就想返回第一個和第二個匹配之間的所有行,丟棄匹配的行。

+0

你能提供一個你需要的輸入和輸出的例子嗎? – 2011-05-10 07:01:09

+0

windows ini文件與我正在解析的文件類型非常接近 – bomber 2011-05-11 22:44:45

回答

2

比方說,你的第一個模式是模式1和第二圖案是模式2

則表達式將是(?<=pattern1)(.*?)(?=pattern2)

(?<=pattern1) - 這將匹配前綴模式,但是從捕獲
(?=pattern2)排除它 - 這將匹配後綴模式但排除它從捕獲

+1

@bomber - 沒有任何答案有效? – 2011-05-24 00:43:50

1

有可能是一種更優雅的方式,但這將工作

function ParseFile 
{ 
    param([string] $FileName) 
    $s = gc $FileName; 
    for($x = 0 ; $X -lt $s.count; $x++) 
    { 
     if(-not $first){ 
      if($s[$x] -match "1000"){ 
       $first =$x 
      } 
     } 
     else{ 
      if($s[$x] -match "1075"){ 
       $second = $x ; 
       break; 
      } 
     } 

    } 
    (($first +1) .. ($second -1))|%{ 
     $ret += $s[$_] 
    } 
    return $ret; 
} 
1

我用foreach$foreach.Movenext()

foreach ($line in (Get-Content $file)) 
{ 
    if ($line -match $firstTag) 
    { 
     do { 
      $line 
      $foreach.MoveNext() 
     } until ($foreach.current -match $secondTag) 
     continue 
    } 
} 

這將只是一個一個返回的每一行,但你可以做你該做的環中喜歡什麼,如果你需要處理結果某種程度上

1

這是我的一個(法國拼裝; O)),想象中的文件C:\ TEMP \ gorille.txt:

C'est à travers de larges grilles, 
Que les femelles du canton, 
Contemplaient un puissant gorille, 
Sans souci du qu'en-dira-t-on. 
Avec impudeur, ces commères 
Lorgnaient même un endroit précis 
Que, rigoureusement ma mère 
M'a défendu de nommer ici... 
Gare au gorille !... 

這裏是廣州之間的」文本「和‘endroit’

PS > (((Get-Content -Path C:\temp\gorille.txt) -join "£" | Select-String -Pattern "(?=canton)(.*)(?<=endroit)").matches[0].groups[0].value) -split "£" 
canton, 
Contemplaient un puissant gorille, 
Sans souci du qu'en-dira-t-on. 
Avec impudeur, ces commères 
Lorgnaient même un endroit 

我參加所有以特殊字符的線條‘£’(選擇onather之一,如果使用),然後使用@Alex氮雜格局cmdlet的Select-String然後再次分裂。

0
$start = select-string -Path $path -pattern $pattern1 -list | 
    select -expand linenumber 

$end = select-string -path $path -pattern $pattern2 | 
    where-object {$_.linenumber -gt $start} | 
    sort linenumber -desc | 
    select -first 1 -expand linenumber 

(get-content $path)[$start..($end -2)]