我的记事本文件中有以下输入行。
示例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'条件在多行中搜索文本。类似的东西...
谢谢!
答案 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的答案应该可以解决问题。