2017-10-19 64 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以將其寫入新文件。