web-dev-qa-db-ja.com

Windows PowerShellでの部分的な文字列の一致に基づいてテキストファイルの行全体を削除する

だから私はいくつかの大きなテキストファイルを並べ替え、特定のキーワードを含む行をすべて削除する必要があります。したがって、基本的に、これらの行がある場合:

これはテストではありません
これはテストです
たぶんテスト
間違いなくテストではない

そして、「not」でスクリプトを実行します。1行目と4行目を完全に削除する必要があります。

私は試してみました:

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

ただし、行全体ではなく、「プログラム」のみが置き換えられます。

23
Charles

これが私がすることです:

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

Snarkの行 は同じことを行いますが、すべてのファイルを配列にロードすることから始まります。これは、大きなファイルではメモリに関して問題になる可能性があります。

26
buti-oxa

これは動作します:

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

-notmatchオプションを指定して 'Select-String'を使用することもできます。

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

私はこれを機能させるために必要なだけで、次のことを思いつきました:

$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)

ライン。

このように構成することで、関数を作成し、部分的に一致するテキスト文字列を渡し、渡された値を使用してスクリプトブロックを作成し、正しく機能させることができます。

上記の答えは、変数内で置き換えられる値を渡す方法を正しく説明していません。

0