Excluindo linhas inteiras em um arquivo de texto com base em uma correspondência de cadeia parcial com o Windows PowerShell

19

Portanto, tenho vários arquivos de texto grandes que preciso classificar e removo todas as ocorrências de linhas que contêm uma determinada palavra-chave. Então, basicamente, se eu tiver essas linhas:

This is not a test
This is a test
Maybe a test
Definitely not a test

E eu corro o script com 'not', eu preciso excluir totalmente as linhas 1 e 4.

Eu tenho tentado com:

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

mas apenas substitui o "Programa" e não a linha inteira.

    
por karel 08.03.2010 / 22:24

4 respostas

22

Veja o que eu faria:

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

A linha de Snark faz o mesmo, mas começa com o carregamento de todo o arquivo em uma matriz, o que pode ser problemático com arquivos grandes em termos de memória.

    
por 22.06.2010 / 17:04
6

Isso funcionará:

(Get-Content "D:\Logs\co2.txt") -notmatch "not" | Out-File "D:\Logs\co2.txt"
    
por 08.03.2010 / 23:25
0

Você também pode usar 'Select-String' com a opção -notmatch:

Select-String 'not' .\input.txt -notmatch | % {$_.Line} | set-content output.txt
    
por 02.06.2012 / 23:13
0

Eu só precisava fazer isso funcionar e fiz o seguinte:

$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

A chave é que o 'Where-Object' usando um bloco de script (como denotado pelas chaves) requer declarar a variável em um evento de criação de bloco de script, daí o

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

linha.

Ao estruturá-lo dessa maneira, é possível criar uma função, passar uma string de texto para corresponder parcialmente, executar a criação do bloco de script com o valor passado e fazer com que ela funcione corretamente.

As respostas acima não explicam corretamente como passar o valor a ser substituído dentro de uma variável.

    
por 22.03.2018 / 23:11