如何只复制两个标题之间的句子



我有一个文本文件,里面有很多标题和下面的几句话。我想搜索标题,如果标题可用,我想把标题下面的句子复制到下一个标题。

在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语句。

所有与其中一个标头不匹配的行都将触发默认条件。只有在找到第一个标头的情况下,默认条件才会输出一行。

相关内容

  • 没有找到相关文章

最新更新