Powershell搜索两行

时间:2013-06-16 13:44:07

标签: powershell lines

我的记事本文件中有以下输入行。

示例1:

//UNION TEXT=firststring,FRIEND='ABC,Secondstring,ABAER'

示例2:

//UNION TEXT=firststring,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
//            FRIEND='ABC,SecondString,ABAER'

基本上,一条线可以跨越两三条线。如果最后一个字符为,,则将其视为连续字符。

在示例1中 - 文本在一行中。 在示例2中 - 相同的文本分为两行。

在示例1中,我可以写下面的代码。但是,如果“输入文本”基于连续字符,

跨越两行或三行,我不知道如何执行此操作
$result = Get-Content $file.fullName | ? { ($_ -match firststring) -and ($_ -match 'secondstring')}

我认为我需要一种方法,以便我可以使用'-and'条件在多行中搜索文本。类似的东西...

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以阅读文件的整个内容,加入连续的行,然后按行分割文本:

$text = [System.IO.File]::ReadAllText("C:\path\to\your.txt")
$text -replace ",`r`n", "," -split "`r`n" | ...

答案 1 :(得分:0)

# get the full content as one String
$content = Get-Content -Path $file.fullName -Raw
# join continued lines, split content and filter
$content -replace '(?<=,)\s*' -split '\r\n' -match 'firststring.+secondstring'

答案 2 :(得分:0)

如果文件很大并且你想避免将整个文件加载到内存中,你可能想要使用旧的.NET ReadLine:

$reader = [System.IO.File]::OpenText("test.txt")
try {
    $sb = New-Object -TypeName "System.Text.StringBuilder";

    for(;;) {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }

        if ($line.EndsWith(','))
        {
            [void]$sb.Append($line)
        }
        else
        {
            [void]$sb.Append($line)
            # You have full line at this point.
            # Call string match or whatever you find appropriate.
            $fullLine = $sb.ToString()
            Write-Host $fullLine
            [void]$sb.Clear()
        }
    }
}
finally {
    $reader.Close()
}

如果文件不大(假设&lt; 1G),Ansgar Wiechers的答案应该可以解决问题。