2017-10-19 59 views
1

在文本文件中多行我有一个文本文件,如下图所示:删除使用PowerShell

[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组]?请注意,由于此文本文件不是静态的,因此不能使用行号或范围。

所以我做了什么,我解析了所有的字符串,用“@”替换了换行符,并使用类似操作符查找值,将内容复制到另一个文本文件。但我想实现的不是选择组,而是取消选择它 - 选择除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

您是否在发布之前尝试在StackOverflow上搜索您的问题?当你写这个问题时,你碰到过这个建议的类似问题吗? – Clijsters

+0

是的,我做到了。但是我在使用正则表达式时遇到了麻烦,而且不太熟悉它。虽然有很多关于它的教程,但不要指望新手轻易获得它。希望你能理解。谢谢 – ninpot18

回答

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,当遇到"[6107]"时翻转到$false,并在下一个"["出现时再次返回到$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以将其写入新文件。