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


22

因此,我需要整理一些大型文本文件,并删除所有出现的包含给定关键字的行。所以基本上,如果我有这些话:

这不是测试
这是测试
也许是测试
绝对不是测试

我用“ not”运行脚本,我需要完全删除第1行和第4行。

我一直在尝试:

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

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

Answers:


25

这就是我要做的:

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

Snark的代码行也是如此,但是首先将所有文件加载到数组中,这可能会在内存方面对大文件造成问题。


我建议您使用Set-Content而不是Out-File,后者处理原始数据,并且不会切断字符串或​​格式化对象。
JasonMArcher

@JasonMArcher您可以使用发布一个示例Set-Content吗?我认为这Set-Content不是的替代品Out-File
伊恩·塞缪尔·麦克莱恩

Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt Out-File本质上是Set-Content,但是它通过默认格式而不是简单的字符串转换来运行输入。
JasonMArcher

我遇到了完全相同的问题,您的回答是我需要的99%。最后一个问题是,我使用$ variable在循环中运行命令(在您的示例中替换为“ not”)。如果我对字符串进行硬编码,则可以完美工作;但是如果我使用变量,它什么也没做。知道为什么吗?我已经尝试了裸变量并将其放在“引号”中
Stephen R

如何修改它以替换这些行上的文本
Tom

7

这将起作用:

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

这仅在名为True的第二个文件中返回一行。

更正:这仅在第二个文件中返回由“ True”组成的一行。是否可能缺少“ Foreach-Object {$ _”,所以它每行运行一次?编辑:好吧,实际上它现在无关紧要,它删除了我希望清除的文件。无论如何,谢谢您的帮助,但我仍然好奇正确的命令是什么,以便将来我能做得到?

1
它适用于我上面的4条测试线。
斯纳克

2
永远不会覆盖原始文件!
user33788 2010年

3
同意,但是我使用了与原始海报相同的文件名,以使答案更容易。他将co2.txt用于输入和输出。
Snark

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)

线。

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

上面的答案不能正确解释如何在变量中传递要替换的值。


您能(更清楚地)说明这比Snark(更简洁)的答案更好吗?请不要在评论中回复;编辑您的答案,使其更清晰,更完整。
斯科特(Scott)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.