19

Поэтому у меня есть несколько больших текстовых файлов, которые мне нужно отсортировать, и удалить все вхождения строк, которые содержат данное ключевое слово. В общем, если у меня есть эти строки:

Это не тест
Это тест
Может быть тест
Определенно не тест

И я запускаю скрипт с 'not', мне нужно полностью удалить строки 1 и 4.

Я пытался с:

PS C:\Users\Admin> (Get-Content "D:\Logs\co2.txt") | 
Foreach-Object {$_ -replace "3*Program*", ""} | 
Set-Content "D:\Logs\co2.txt"

но он заменяет только «Программу», а не всю строку.

4 ответа4

22

Вот что я бы сделал:

Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt

Строка Снарка делает то же самое, но начинается с загрузки всего файла в массив, что может быть проблематично с большими файлами в памяти.

6

Это будет работать:

(Get-Content "D:\Logs\co2.txt") -notmatch "not" | Out-File "D:\Logs\co2.txt"
0

Вы также можете использовать «Select-String» с опцией -notmatch:

Select-String 'not' .\input.txt -notmatch | % {$_.Line} | set-content output.txt
0

Мне просто нужно было заставить это работать и придумал следующее:

$InServerName = 'SomeServerNameorIPAddress'
$InFilePath = '\Sharename\SomePath\'
$InFileName = 'Filename.ext'

$OutServerName = 'SomeServerNameorIPAddress'
$OutFilePath = '\Sharename\SomePath\'
$OutFileName = 'Filename.out'

$InFile = -join('\\',$InServerName,$InFilePath,$InFilename)
$OutFile = -join('\\',$OutServerName,$OutFilePath,$OutFilename)
$FindStr = 'some string to match on'
$CompareStr = [scriptblock]::Create($FindStr)
$CompareStr
Get-Content $InFile | Where-Object {$_ -notmatch $CompareStr} | Set-Content $OutFile
Get-Content $OutFile

Ключевым моментом является то, что для 'Where-Object', использующего блок скрипта (как обозначено фигурными скобками), требуется объявить переменную в событии создания блока скрипта, следовательно,

$CompareStr = [scriptblock]::Create($FindStr)

линия.

Структурируя его таким образом, можно создать функцию, передать ей текстовую строку для частичного совпадения, выполнить создание блока сценария с переданным значением и заставить его работать правильно.

Ответы выше не правильно объясняют, как передать значение, которое будет заменено в переменной.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .