Использование 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
Это именно то, что я хотел. Спасибо @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-символом является обратная кавычка (`). См. раздел О экранирующих символах. - person orad; 22.10.2014
comment
@orad Я знаю об этом. Однако в регулярных выражениях escape-символом является обратная косая черта. Оба работают в этом случае. - 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