2012-09-26 73 views
0

我有內容的文件看起來像這樣:分割文件內容分組由頭

[Something1Something2] 
- Interesting data 1 
- Interesting data 2 

[Something3] 
- Interesting data 1 
- Interesting data 2 

[Something4] 
- Interesting data 1 
- Interesting data 2 

我想用灑或其他一些我未知的命令來獲得部分恢復,然後我可以指數像這樣:

$myStringArray[0] 

prints: 

- Interesting data 1 
- Interesting data 2 

我曾嘗試通過使用正則表達式,但沒有運氣來實現這一目標:

"[Somthing1] somedata1 [Something2] somedate2" -split "\[(.*)\]" 

我意識到,這是不是多線如上所述,但原則是相同的,只爲測試。

如果我這樣做上述文件,嘗試一下用多線:

$myfile = Get-Content .\test.txt 
($myfile -split "\[.*\]") 

我得到的14個,而不是3項的數組。

+0

有多單線路匹配之間的正則表達式的差異。 – Nick

回答

0

我找到了一個解決方案,但是不是一個漂亮的一個:

Function GetEntriesMatching($filename, $tagMatch) 
{ 
    Write-Host "Filename: $filename" 
    Write-Host "Tag: $tagMatch" 

    $regex = "\[.*($tagMatch).*\]" 
    Write-Host "Regex: $regex" 

    $Lines = Get-Content $filename 
    $Out = $False 
    $returnValue = @() 

    ForEach ($Line In $Lines) 
    { 
     If ($Line -match '\[.*\]') {$Out = $False} 
     If ($Out -eq $True) {$returnValue += "<br> $Line </br>"} 
     If ($Line -match $regex) {$Out = $True} 
    } 

    if($returnValue.Count -eq 0) 
    { 
     $returnValue += "<b>NO ENTRIES FOUND FOR $tagMatch</b>" 
    } 

    return $returnValue 
} 

如果任何人有這樣做的巧妙方式我真的想看看吧:)。

親切的問候

0

嘗試此正則表達式:

(?mi)^\[.*\]{1}\s 

要導入的文件,試試這個:

$myfile = [io.file]::ReadAllText(".\test.txt") 

這將導入的文件作爲一個單一的價值,而不是獲取內容返回的數組。

從那裏,你應該能夠做到這一點:

[regex]::Split($myfile,"(?mi)^\[.*\]{1}\s") 

這將不包括在分割搜索字符串。

如果你想包括搜索字符串,你需要給我們一個前瞻,就像這樣:

[regex]::Split($myfile,"(?=(?mi)^\[.*\]{1}\s)")