簡體   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