PowerShell正则表达式过滤文件

时间:2015-06-10 14:11:41

标签: regex powershell

我正在尝试使用PowerShell过滤文件,我需要在</tr><tr>之间插入一个新行字符,将它们分成不同的行,然后删除所有匹配<tr>多个字符的行BTE多个字符</tr>并保存文件。

原谅我,因为我是PowerShell的新手,这在SED中很简单,但我必须使用PowerShell。这就是我所拥有的,但可能是完全错误的。

Get-Content *.htm | Foreach-Object {$_ -replace '</tr><tr>', '</tr>\r\n<tr>'; $_}f
Get-Content *.htm | Foreach-Object {$_ -replace '<tr>.*BTE.*</tr>', ''; $_}

2 个答案:

答案 0 :(得分:1)

所以听起来你需要将更改保存回原始文件。此外,我们应该只能在一次通过中进行这些更改,而不是两次读取文件。

Get-ChildItem *.htm | Foreach-Object {
    $singleFileName = $_.FullName
    (Get-Content $singleFileName) -replace '</tr><tr>', "</tr>`r`n<tr>" -replace '<tr>.*BTE.*</tr>' | Set-Content $singleFileName
}

您无法读取和写入管道中的同一文件。我们将(Get-Content $singleFileName)放在括号中,以便立即读取整个文件。

Get-Content $singleFileName | Set-Content $singleFileName

当每一行传递到管道时,文件保持打开状态,以便Set-Content无法写入。

答案 1 :(得分:0)

如果RegEx能够捕获这样的组,我认为你不必插入换行符。

Get-ChildItem *.htm  | Foreach-Object {
    $singleFileName = $_.FullName
    ([RegEx]::Matches((Get-Content  $singleFileName),'<tr>.*?</tr>')).Value|?{$_ -notlike '<tr>*BTE*</tr>'} | Set-Content $singleFileName
}