我正在尝试使用以下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
,它在文件中重复多次,我试图只匹配上面指定的第一部分。那是对的吗?目前我输出为空。
我错过了什么吗?
答案 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
表示"匹配a
或b
"。如果要匹配文字|
字符,则需要将其转义:
... | 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
}