使用Powershell删除文本文件中的多行

时间:2017-10-19 07:08:17

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

所以我做了什么,我解析了所有字符串,用" @"替换了换行符。并使用-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!

1 个答案:

答案 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,以将其写入新文件。