我有一个如下文字文件:
[Option]
DuplicateUncoveredDiff = 1
KeptPatternMaxCount = 7
[6107]
CtrlFlag = 10
Version =1532
[6900]
CtrlFlag = 10
Version =1532
...and some more text here
我正试图找到一种删除组下多行的方法。当我说组时,我指的是 []括号中的字符串以及其下的任何内容。
例如,这是第1组:
[Option]
DuplicateUncoveredDiff = 1
KeptPatternMaxCount = 7
第2组:
[6107]
CtrlFlag = 10
Version =1532
有没有办法删除行[第2组]?请注意,不能使用行号或范围,因为此文本文件不是静态的。
所以我做了什么,我解析了所有字符串,用" @"替换了换行符。并使用-like运算符查找值 6107 ,将内容复制到另一个文本文件。但我想要实现的不是选择组,我想取消选择它 - 选择除6107组之外的所有其他行。我尝试使用替换,在6107之后放置通配符]并且在第一次出现之前[但它删除了所有内容。
$content = Get-Content $filePath\$fileName -Raw
$content -replace "`n|`r", "@" | Set-Content $localPath\$newFile
$newContent = Get-Content $localPath\$newFile
if($newContent -like "*6107*")
{
$newContent -replace ".*6107]","" -replace "\[.*","" | Set-Content
"$folderPath\6107.txt"
}
请帮忙。 TIA!
答案 0 :(得分:2)
由于你似乎在使用正则表达式时遇到了麻烦,让我们尝试一下,如果我们可以不用它。 (这里有很多关于你做错了什么的线索,所以我不想进入这个问题,而且要记住大多数时候有多种方法可以做某事总是好的。)
你有一些文字,你想要决定是否要保留它们,如下所示:
keep [Option] keep DuplicateUncoveredDiff = 1 keep KeptPatternMaxCount = 7 keep [6107] CtrlFlag = 10 Version =1532 keep [6900] keep CtrlFlag = 10 keep Version =1532 keep keep ...and some more text here
因此,假设我们按行顺序查看文本,我们需要的是“保持”标记,默认情况下为$true
,并在遇到$false
时翻转到"[6107]"
,并且当下一个$true
出现时,再次返回"["
。然后可以使用此标志过滤行。
我们可以使用Where-Object
cmdlet来跟踪标记并过滤行:
$keep = $true
Get-Content yourtextfile.txt | where {
if ( $_.StartsWith("[6107]") ) {
$keep = $false
} elseif ( -not $keep -and $_.StartsWith("[") ) {
$keep = $true
}
$keep
}
Get-Content
已将文本文件拆分为行,因此我们可以将它们直接传递给Where-Object
。
请注意$keep
如何翻转到$false
并保持$false
,直到以"["
开头的下一行。
您可以将该权限的结果传递给Set-Content
,以将其写入新文件。