繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM