我有一个文本文件,里面有很多标题和下面的几句话。我想搜索标题,如果标题可用,我想把标题下面的句子复制到下一个标题。
在PowerShell中可能吗?请帮助我我尝试了
$linenumber= Get-Content "C:UsersKSYEDSUDocumentstemp4491309.txt" | select-string $search
Select-String $string $dataRead -Context 1, $linenumber| % { $_.Context.PostContext } | out-file "C:UsersKSYEDSUDocumentstempResults.txt"
但它抛出了一个错误,告诉我们它正在期待更大的
$linenumber= Get-Content "C:UsersKSYEDSUDocumentstemp4491309.txt" | select-string $search
Select-String $string $dataRead -Context 1, $linenumber| % { $_.Context.PostContext } | out-file "C:UsersKSYEDSUDocumentstempResults.txt"
例如:
Heading A
1234
34545
13213
Heading B
因此,我将搜索标题A,如果它可用,则开始复制from 1234... till 13213
。
Select-String
会在文本中找到字符串,但不会将位置返回为int。您可以在文件中循环,手动查找标题并收集两者之间的数据。
#Get file content as string array
[System.String[]]$FileContent = Get-Content -Path 'C:UsersKSYEDSUDocumentstemp4491309.txt'
#For each line in the file
for ($i = 0; $i -lt $FileContent.Count; $i ++)
{
#If the line equals your start header
if ($FileContent[$i] -eq 'Heading A')
{
$i ++ #Get the next line
#Return line until end header appears
while ($FileContent[$i] -ne 'Heading B')
{
$FileContent[$i] #Return line
$i ++ #Get next line
}
}
}
您可以使用regex来完成此操作,这样您就不必遍历文本文件中的所有行:
$headingStart = 'Heading A'
$headingEnd = 'Heading B'
# get the file content in one string, including all newline characters
$content = Get-Content "C:UsersKSYEDSUDocumentstemp4491309.txt" -Raw
# since the real headings may contain characters that have special meaning in regex, we escape them
$regex = '(?s)^{0}s+(.*)s{1}' -f [regex]::Escape($headingStart), [regex]::Escape($headingEnd)
if ($content -match $regex) {
$matches[1] | Out-File -FilePath "C:UsersKSYEDSUDocumentstempResults.txt"
}
else {
Write-Host "No text found between $headingStart and $headingEnd"
}
使用您的示例,生成的文件将包含:
1234 34545 13213
您可以将switch语句与-Regex
和-File
标志组合使用。
$insideHeaders = $false
. {switch -Regex -File "C:UsersKSYEDSUDocumentstemp4491309.txt" {
'Heading A' { $insideHeaders = $true }
'Heading B' { return }
default {
if ($insideHeaders) { $_ }
}
}} | Out-File "C:UsersKSYEDSUDocumentstempResults.txt"
解释:
单引号之间的每个值都是一个正则表达式字符串。您必须对任何特殊的正则表达式字符进行反斜杠((转义,这可以使用
[regex]::Escape(string)
自动完成。
当到达底部标头(本例中为Heading B
(时,return
语句将退出switch语句。
所有与其中一个标头不匹配的行都将触发默认条件。只有在找到第一个标头的情况下,默认条件才会输出一行。