根据使用 Windows PowerShell 的部分字符串匹配删除文本文件中的整行

根据使用 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"

但它只替换了“程序”,而不是整行。

答案1

我会这么做:

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

Snark 的台词功能相同,但它首先将整个文件加载到数组中,这对于大文件的内存可能会有问题。

答案2

这将起作用:

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

答案3

您还可以将“Select-String”与 -notmatch 选项一起使用:

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

答案4

我只需要让它工作并得出以下结论:

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

线。

通过以这种方式构建它,可以创建一个函数,向其传递一个文本字符串以进行部分匹配,使用传递的值执行脚本块创建,并使其正常工作。

上述答案没有正确解释如何传递变量内要替换的值。

相关内容