数据提取使用正则expression式

嗨,我有一个格式的文件

[stuff not needed]Type:A1[stuff not needed] [stuff not needed]Name:B1[stuff not needed] Row:Sampletext Row:Sampletext [stuff not needed]Type:A2[stuff not needed] [stuff not needed]Name:B2[stuff not needed] Row:Sampletext2 Row:Sampletext2 Row:Sampletext2 

我在PowerShell中使用正则expression式来提取数据。

我正在使用像Regex1|Regex2|Regex3 ,并将输出保存到文件。

输出格式为:

 A1 B1 Sampletext Sampletext A2 B2 Sampletext2 Sampletext2 Sampletext2 

我想要的格式

 A1 B1 Sampletext A1 B1 Sampletext A2 B2 Sampletext2 A2 B2 Sampletext2 A2 B2 Sampletext2 

我是PowerShell的新手,有什么办法可以做到这一点?

这是我的确切代码:

 $input_path = 'idx.txt' $output_file = 'output.txt' $regex = 'Type:\s([A-Za-z]*)|Name:\s\s([A-Za-z]*)|[A-Za-z][a-z0-9A-Z_]*(?:\s*[0-6]\s*[0-4]\s\s[\s\d]\d\s*0)' select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file 

数据太大,无法在这里发布,但不好的只是创build一个示例数据集。但正则expression式正在工作,可能是粗糙的,但它捕获所需的数据。 为了这个例子,我们可以把Type:([A-Za-z] )| Name:([A-Za-z] )| Row:([A-Za-z] *)作为正则expression式

检查每一行是否有typename ,只设置相应的variables,但是如果它有row输出types和名称variables以及当前行内容。

 $allmatches = Select-String '(Type|Name|Row):\s*(\w*)' $input_path -allmatches $output = foreach ($m in $allmatches) { $data = $m.Matches.Groups[2].Value switch ($m.Matches.Groups[1].Value) { 'Type' { $type = $data; break } 'Name' { $name = $data; break } 'Row' { "$type $name $data" } } } $output | Set-Content $output_path -Encoding UTF8 

笔记:

  • 我们使用更快的foreach expression式,而不是通过使用带有脚本块的foreach进行更慢的stream水线操作。
  • \w正则expression式中的\w表示任何单词字符,包括a-zA-Z0-9和_以及更多
  • 在PowerShell中默认情况下,正则expression式匹配和string比较是敏感的