如果文本文件包含字符串,则使用PowerShell从文本文件中删除行

时间:2014-06-20 11:25:18

标签: powershell powershell-v2.0 powershell-v3.0

我正在尝试使用以下PowerShell代码从包含部分字符串的文本文件中删除所有行:

 Get-Content C:\new\temp_*.txt | Select-String -pattern "H|159" -notmatch | Out-File C:\new\newfile.txt

实际的字符串是H|159|28-05-2005|508|xxx,它在文件中重复多次,我试图只匹配上面指定的第一部分。那是对的吗?目前我输出为空。

我错过了什么吗?

6 个答案:

答案 0 :(得分:18)

逃离|使用反引号的字符

get-content c:\new\temp_*.txt | select-string -pattern 'H`|159' -notmatch | Out-File c:\new\newfile.txt

答案 1 :(得分:10)

假设您要在同一个文件中编写该文件,可以执行以下操作:

Set-Content -Path "C:\temp\Newtext.txt" -Value (get-content -Path "c:\Temp\Newtext.txt" | Select-String -Pattern 'H\|159' -NotMatch)

答案 2 :(得分:2)

管道符|在正则表达式中具有特殊含义。 a|b表示"匹配ab"。如果要匹配文字|字符,则需要将其转义:

... | Select-String -Pattern 'H\|159' -NotMatch | ...

答案 3 :(得分:1)

在这种情况下您不需要 Select-String,只需使用 Where-Object

过滤掉这些行
Get-Content C:\new\temp_*.txt |
    Where-Object { -not $_.Contains('H|159') } |
    Set-Content C:\new\newfile.txt

String.Contains 进行字符串比较而不是正则表达式,因此您无需对管道字符进行转义,而且速度也更快

答案 4 :(得分:0)

另一种写入同一文件的选项,以现有答案为基础。只需在内容发送到文件之前添加括号即可完成操作。

(get-content c:\new\sameFile.txt | select-string -pattern 'H`|159' -notmatch) | Out-File c:\new\sameFile.txt

答案 5 :(得分:0)

这可能是解决一个简单问题的很长的路要走,它确实允许我删除包含多个匹配项的行。我没有可以使用的部分匹配,并且需要对 1000 多个文件进行匹配。 这篇文章确实帮助我到达了我需要的地方,谢谢。

$ParentPath = "C:\temp\test"
$Files = Get-ChildItem -Path $ParentPath -Recurse -Include *.txt
$Match2 = "matchtext1"
$Match2 = "matchtext2"
$Match3 = "matchtext3"
$Match4 = "matchtext4"
$Match5 = "matchtext5"
$Match6 = "matchtext6"
$Match7 = "matchtext7"
$Match8 = "matchtext8"
$Match9 = "matchtext9"
$Match10 = "matchtext10"

foreach ($File in $Files) {
    $FullPath = $File | % { $_.FullName }
    $OldContent = Get-Content $FullPath
    $NewContent = $OldContent `
    | Where-Object {$_ -notmatch $Match1} `
    | Where-Object {$_ -notmatch $Match2} `
    | Where-Object {$_ -notmatch $Match3} `
    | Where-Object {$_ -notmatch $Match4} `
    | Where-Object {$_ -notmatch $Match5} `
    | Where-Object {$_ -notmatch $Match6} `
    | Where-Object {$_ -notmatch $Match7} `
    | Where-Object {$_ -notmatch $Match8} `
    | Where-Object {$_ -notmatch $Match9} `
    | Where-Object {$_ -notmatch $Match10}
    Set-Content -Path $FullPath -Value $NewContent
    Write-Output $File
}