我有一个原始文本文件,其中包含需要复制到另一个文件的数据块,并且每个数据块都必须位于一个新文件中。
这是数据块
HOST 123... TEST ... IP... DONE... HOST 123... TEST ... IP... DONE...
在读取原始文本文件之后,想要在HOST
和DONE
之间复制该块并将其粘贴到新文件,并且每次找到该块时,都将数据粘贴到另一个文件中。
最后,它应该是多个文件,上面有数据块。
到目前为止,我有以下内容:
$flag = 0 Get-Content file.txt
Get-Content
for each {Switch -Wildcard($_)
{"HOST" {$flag = 1} "DONE" {$flag = 0}}
if ($flag -eq 1){Out-File out.txt -InputObjects $_ -Append}}
答案 0 :(得分:0)
我确信有更好的方法来执行此操作,但这对于提取HOST
和DONE
行之外的块应该有效:
$FileContents = Get-Content file.txt
$HostLines = ($FileContents | Select-String -Pattern "^HOST.*$" -AllMatches -CaseSensitive).linenumber
$DoneLines = ($FileContents | Select-String -Pattern "^DONE.*$" -AllMatches -CaseSensitive).linenumber
for ($i = 0; $i -lt $HostLines.count; $i++) {
$FileContents[($HostLines[$i])..($DoneLines[$i]-2)] | out-file -FilePath ("File" + $i + ".txt")
}
上面的代码会将您的代码块提取到以File0.txt
,File1.txt
等开头的文件中。显然,在某些情况下,如果您有其他以{开头的行{1}}或您打算包含的HOST
。
要包含DONE
和HOST
行:
DONE
循环根据$FileContents = Get-Content file.txt
$HostLines = ($FileContents | Select-String -Pattern "^HOST.*$" -AllMatches -CaseSensitive).linenumber
$DoneLines = ($FileContents | Select-String -Pattern "^DONE.*$" -AllMatches -CaseSensitive).linenumber
for ($i = 0; $i -lt $HostLines.count; $i++) {
$FileContents[($HostLines[$i]-1)..($DoneLines[$i]-1)] | out-file -FilePath ("File" + $i + ".txt")
}
和$HostLines
内容的准确性而工作。这两个变量分配都是在搜索文本文件后显示行号的结果。 $DoneLines
包含一个以$HostLines
开头的每个行号的数组。 HOST
包含一个以$DoneLines
开头的每个行号的数组。 for循环使用DONE
在数组的每个元素中递增。 $i
返回数组索引$HostLines[$i]
处的值。该值是行号。 $i
从行号中减去一个,因为$HostLines[$i]-1
也是一个数组。数组索引从0而不是1开始。因此,如果要第3行,则需要$FileContents
。 $FileContents[2]
索引包含范围运算符[1..4]
。这将返回索引1,2、3和4的所有值。
以下是访问数组值的示例:
(..)