我有一个包含数据行的文本文件.我可以使用以下的powershell脚本来提取我感兴趣的行:
select-string -path *.txt -pattern "subject=([A-Z\.]+),"
Run Code Online (Sandbox Code Playgroud)
一些示例数据将是:
blah blah subject=THIS.IS.TEST.DATA, blah blah blah
Run Code Online (Sandbox Code Playgroud)
我想要的是能够只提取主题的实际内容(即"THIS.IS.TEST.DATA"字符串).我试过这个:
select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0] }
Run Code Online (Sandbox Code Playgroud)
但"匹配"属性始终为空.我究竟做错了什么?
dan*_*gph 11
我不知道为什么你的版本不起作用.它应该工作.这是一个有用的丑陋版本.
$p = "subject=([A-Z\.]+),"
select-string -path *.txt -pattern $p | % {$_ -match $p > $null; $matches[1]}
Run Code Online (Sandbox Code Playgroud)
编辑.dant的解释:
-match 是正则表达式匹配运算符:
>"foobar" -match "oo.ar"
True
Run Code Online (Sandbox Code Playgroud)
在> $null刚刚抑制真正被写入到输出.(尝试删除它.)有一个cmdlet执行同样的事情,我现在不记得这个名字.
$matches是一个魔术变量,它保存最后一次-match操作的结果.
在PowerShell V2 CTP3中,实现了Matches属性。因此,以下将起作用:
select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0].Groups[1].Value }
Run Code Online (Sandbox Code Playgroud)