[英]Delete multiple lines in a text file using Powershell
我有一个如下文本文件:
[Option]
DuplicateUncoveredDiff = 1
KeptPatternMaxCount = 7
[6107]
CtrlFlag = 10
Version =1532
[6900]
CtrlFlag = 10
Version =1532
...and some more text here
我正在尝试找到一种删除组下多行的方法。 当我说group时,我指的是[]括号内的字符串及其下的所有内容。
例如,这是第1组:
[Option]
DuplicateUncoveredDiff = 1
KeptPatternMaxCount = 7
第2组:
[6107]
CtrlFlag = 10
Version =1532
有没有办法删除行[Group 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!
由于您似乎在使用正则表达式时遇到问题,因此请尝试是否可以不使用它。 (这里有很多关于您做错了什么的线程,因此,我不想赘述,而且记住大多数时间,做某事的方法不止一种,这总是一件好事。)
您有一些文本行,对于每个文本行,您都需要确定是否要保留它,例如:
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
以将其写入新文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.