在Powershell中删除一些字符串后的文本

时间:2014-08-07 14:24:38

标签: powershell text

我找到了很多用逗号和其他字符分割文件的例子。 但我的目标是获得没有数字签名的干净xml文件。

“脏”xml文件的结构是下一个(错误标签可选)签名可以在一个或两个字符串上:

<?xml version="1.0" encoding="windows-1251"?>
<File "Some txt">
<Doc "Some txt" />
<Error "Some txt" />
</File>

 o000000ЯђeHђрь Ly]°Еоyн.‚а9Ут8$&Ъё• эИoтхњСђ7Мф YЁ7¤GПaм—1z©°QЩяк002094100901ЇьбSќ–ЏXMLд

你猜我需要下一个代码:

<?xml version="1.0" encoding="windows-1251"?>
<File "Some txt">
<Doc "Some txt" />
</File>

我正在尝试下一个脚本:

 Get-ChildItem -Path C:\Scripts\TEST -Filter S*.xml |  ForEach-Object -Process {
 $filename = $_.FullName
 Get-Content $_.FullName | Where-Object {$_ -notmatch 'o000000'} | Set-Content ($filename+".tmp") 
 Remove-Item $filename
 Rename-Item ($filename+".tmp") $filename
  }

可以删除一个字符串中的签名,但不能删除标记后的断路器,也不能删除第二个签名字符串。我该怎么办?

============================================ ==================================== PowerShell v 2.0的解决方案是(感谢 @Keith Hill ):

    Get-ChildItem -Path C:\Scripts\TEST -Filter S*.xml |  ForEach-Object -Process {
    $filename = $_.FullName
    $content = Get-Content $_.FullName | Out-String
    $content -replace '(?ism)(.*?)\s+o000000.*$','$1' | Set-Content "${filename}.tmp"
    Remove-Item $filename
    Rename-Item ($filename+".tmp") $filename
}

1 个答案:

答案 0 :(得分:0)

试试这个 - 将文件作为字符串读取然后你的正则表达式可以跨越行:

Get-ChildItem -Path C:\Scripts\TEST -Filter S*.xml |  ForEach-Object -Process {
    $filename = $_.FullName
    $content = Get-Content $_.FullName -Raw
    $content -replace '(?ism)(.*?)\s+o000000.*$','$1' | Set-Content "${filename}.tmp"
    Remove-Item $filename
    Rename-Item ($filename+".tmp") $filename
}