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