我可以使用Powershell从XML文件中自动提取具有特定模式的未知字符串,然后将该字符串写入文本文件吗?

时间:2019-05-11 11:44:57

标签: powershell text-extraction

在一个包含100行代码的XML文件中,有一个具有特定模式的字符串,我想找到该字符串并将其写入新的文本文件。

该字符串包含的内容是未知的并且可以变化,但是模式是相同的。例如:

12hi34

99ok45

这些元素的共同点是长度为6和元素:

0-1:整数

2-3:个字符

4-5:整数

是否可以使用Powershell编写脚本来找到适合模式的字符串并将其导出到文本文件中?

我是Powershell和脚本的新手。尝试过Google的问题,偶然发现了Select-String,但这不能解决我的问题。希望你们中的一些人可以在这里指导我。谢谢。

编辑:该字符串作为某些“自由文本”位于根元素之外。它不是传统的XML文件。

2 个答案:

答案 0 :(得分:0)

尝试一下...

$f = Get-Content '<xml-file>' -ReadCount 0
foreach ($l in $f) {
    if ($l -match '[0-9]{1,3}[a-zA-Z]{2,3}[0-9]{1,5}') {
        Write-Output $matches.0
    }
}

将文件内容填充到变量中。遍历文件的每一行。按模式解析值。

这里是匹配件的样本...

enter image description here

答案 1 :(得分:0)

假设文件中只包含一个一个标记,并且字母仅限于英文字母'a'到'z':

(Get-Content -Raw in.xml) -replace '(?s).*(\d{2}[a-z]{2}\d{2}).*', '$1' > out.txt

注意:

  • 如果找不到匹配的令牌,则将输入文件的全部内容写入out.txt

  • 在Windows PowerShell >上默认情况下会生成UTF-16LE(“ Unicode”)文件(在PowerShell Core 中为无BOM的UTF-8);通过管道传递到Set-Content out.txt -Encoding ...来创建具有不同编码的文件。

  • Get-Content -Raw以单个字符串读取整个输入文件。

  • -replace运算符使用regular expressions(正则表达式)进行匹配-有关更多信息,请参见this answer

    • 正则表达式开始处的内联选项(?s)也使.匹配换行符。
    • 默认情况下,匹配区分大小写 ;使用-creplace进行区分大小写的 匹配。