如何在Powershell中拆分不规则字符串?

时间:2016-11-28 14:43:56

标签: string powershell select soap

我有一些带SOAP的大型日志/转储(1行没有包装)。 首先,我做了一些简单的Select-string:

$where = "D:\log\Test\"
$what = Get-ChildItem $where -Filter "*.txt"
$regex= "(?=<\?xml).*(Envelope>)"
$Path="d:\Log\"
$Result = "D:\Log\wynik2.log"
$string = select-string -Path $what -Pattern $regex
$string

结果如下:

D:\log\Test\test1.txt:1:g .vI.Y....(A..P.......<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">some text1</soap:Body></soap:Envelope>
D:\log\Test\test1.txt:2:g .vJ.YiB..(...P....R..<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">some text2</soap:Body></soap:Envelope>
    ...
D:\log\Test\test1.txt:4000:g .vL.Yb...'...P.......<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">some text2</soap:Body></soap:Envelope>

如何删除不属于我的SOAP的所有内容(例如:D:\ log \ Test \ test1.txt:4000:g .vL.Yb ...'...... P ...... 。)

2 个答案:

答案 0 :(得分:3)

D:\log\Test\test1.txt:1:是由Select-String添加的信息(文件中找到的匹配的完整路径和行号)。

如果您的文本文件包含单行XML字符串,并且只想从行的开头删除一些类似这样的内容:

Get-ChildItem $where -Filter '*.txt' | ForEach-Object {
  (Get-Content $_.FullName) -replace '^.*?(<\?xml)', '$1' |
    Set-Content $_.FullName
}

这枚举给定文件夹中的所有.txt文件,读取其内容,删除行开头(^)和XML前奏(<\?xml)之间的字符串,然后写入修改后的文件文字回到文件。

答案 1 :(得分:-1)

不太了解SOAP,但有更多信息可能有助于解析字符串。最简单的方法可能就是遍历你的字符串数组,然后只拉一个从行的开头到<的索引位置的子字符串,这样就像

foreach($s in $string){
  $s.substring(0,$s.indexOf('<'))
}

如果您愿意,也可以使用正则表达式进行操作,但在我看来这是更多的工作。