Използване на PowerShell за премахване на редове от текстов файл, ако съдържа низ

Опитвам се да премахна всички редове от текстов файл, който съдържа частичен низ, като използвам кода на PowerShell по-долу:

 Get-Content C:\new\temp_*.txt | Select-String -pattern "H|159" -notmatch | Out-File C:\new\newfile.txt

Действителният низ е H|159|28-05-2005|508|xxx, той се повтаря във файла няколко пъти и аз се опитвам да съпоставя само първата част, както е посочено по-горе. Вярно ли е? В момента получавам празен като изход.

Изпускам ли нещо?


person user3759904    schedule 20.06.2014    source източник


Отговори (6)


Избягайте от | символ с обратна отметка

get-content c:\new\temp_*.txt | select-string -pattern 'H`|159' -notmatch | Out-File c:\new\newfile.txt
person Fourkeys    schedule 20.06.2014
comment
Предупреждение - използвах това, за да се опитам да актуализирам файл на място и файлът беше изтрит. - person alex; 14.06.2019

Да предположим, че искате да запишете това в същия файл, можете да направите следното:

Set-Content -Path "C:\temp\Newtext.txt" -Value (get-content -Path "c:\Temp\Newtext.txt" | Select-String -Pattern 'H\|159' -NotMatch)
person Samselvaprabu    schedule 05.04.2017
comment
Точно това исках. Thx @Samselvaprabu! - person jyao; 25.03.2019

Символът за тръба | има специално значение в регулярните изрази. a|b означава "съвпада с a или b". Ако искате да съвпаднете с литерал | символ, трябва да го екранирате:

... | Select-String -Pattern 'H\|159' -NotMatch | ...
person Ansgar Wiechers    schedule 20.06.2014
comment
В PowerShell екраниращият знак е обратната отметка (`). Вижте Всичко за Escape Characters. - person orad; 22.10.2014
comment
@orad Наясно съм с това. В регулярните изрази обаче символът за екраниране е обратната наклонена черта. И двете работят в случая. - person Ansgar Wiechers; 22.10.2014

Не се нуждаете от Select-String в този случай, просто филтрирайте редовете с Where-Object

Get-Content C:\new\temp_*.txt |
    Where-Object { -not $_.Contains('H|159') } |
    Set-Content C:\new\newfile.txt

String.Contains прави низ сравнение вместо регулярен израз, така че не е необходимо да избягвате знака за тръба, а освен това е по-бързо

person phuclv    schedule 12.04.2021
comment
Харесвам това решение пред Fourkeys, защото (освен ако не съм идиот) Select-String също добавя име на файл и номер на ред към изхода, което не е желано в моя случай на употреба. - person tolache; 05.07.2021

Друга възможност за писане в същия файл, надграждайки съществуващите отговори. Просто добавете скоби, за да завършите действието, преди съдържанието да бъде изпратено във файла.

(get-content c:\new\sameFile.txt | select-string -pattern 'H`|159' -notmatch) | Out-File c:\new\sameFile.txt
person Robert Brooker    schedule 12.04.2021

Това вероятно е дълъг път към прост проблем, той ми позволява да премахна редове, съдържащи определен брой съвпадения. Нямах частично съвпадение, което да може да се използва, и трябваше да се направи на над 1000 файла. Тази публикация ми помогна да стигна там, където трябваше, благодаря.

$ParentPath = "C:\temp\test"
$Files = Get-ChildItem -Path $ParentPath -Recurse -Include *.txt
$Match2 = "matchtext1"
$Match2 = "matchtext2"
$Match3 = "matchtext3"
$Match4 = "matchtext4"
$Match5 = "matchtext5"
$Match6 = "matchtext6"
$Match7 = "matchtext7"
$Match8 = "matchtext8"
$Match9 = "matchtext9"
$Match10 = "matchtext10"

foreach ($File in $Files) {
    $FullPath = $File | % { $_.FullName }
    $OldContent = Get-Content $FullPath
    $NewContent = $OldContent `
    | Where-Object {$_ -notmatch $Match1} `
    | Where-Object {$_ -notmatch $Match2} `
    | Where-Object {$_ -notmatch $Match3} `
    | Where-Object {$_ -notmatch $Match4} `
    | Where-Object {$_ -notmatch $Match5} `
    | Where-Object {$_ -notmatch $Match6} `
    | Where-Object {$_ -notmatch $Match7} `
    | Where-Object {$_ -notmatch $Match8} `
    | Where-Object {$_ -notmatch $Match9} `
    | Where-Object {$_ -notmatch $Match10}
    Set-Content -Path $FullPath -Value $NewContent
    Write-Output $File
}
person Nuno Chaves    schedule 07.06.2021