在PowerShell中选择字符串(grep)时,如何仅返回匹配的正则表达式?

时间:2009-04-29 23:26:33

标签: regex powershell grep

我想在文件中找到一个模式。当我使用Select-String获得匹配时,我不想要整行,我只想要匹配的部分。

我可以使用参数来执行此操作吗?

例如:

如果我做了

select-string .-.-.

并且文件包含一行:

abc 1-2-3 abc

我想获得 1-2-3 的结果,而不是返回整行。

我想知道Powershell等同于grep -o

8 个答案:

答案 0 :(得分:36)

或者只是:

Select-String .-.-. .\test.txt -All | Select Matches

答案 1 :(得分:25)

大卫正走在正确的道路上。 [regex]是System.Text.RegularExpressions.Regex

的类型加速器
[regex]$regex = '.-.-.'
$regex.Matches('abc 1-2-3 abc') | foreach-object {$_.Value}
$regex.Matches('abc 1-2-3 abc 4-5-6') | foreach-object {$_.Value}

如果它太冗长,你可以将它包装在一个函数中。

答案 2 :(得分:17)

我尝试了其他方法:Select-String返回属性可以使用的匹配项。要获得所有匹配项,您必须指定-AllMatches。否则它只返回第一个。

我的测试文件内容:

test test1 alk atest2 asdflkj alj test3 test
test test3 test4
test2

剧本:

select-string -Path c:\temp\select-string1.txt -Pattern 'test\d' -AllMatches | % { $_.Matches } | % { $_.Value }

返回

test1 #from line 1
test2 #from line 1
test3 #from line 1
test3 #from line 2
test4 #from line 2
test2 #from line 3

Select-String at technet.microsoft.com

答案 3 :(得分:11)

本着teach a man to fish ...

的精神

您要做的是将select-string命令的输出传输到 Get-member ,这样您就可以看到对象具有哪些属性。完成后,您将看到“匹配”,您可以通过将输出汇总到| **Select-Object** Matches来选择它。

我的建议是使用以下内容:select linenumber,filename,matches

例如:在stej的样本上:

sls .\test.txt -patt 'test\d' -All |select lineNumber,fileName,matches |ft -auto

LineNumber Filename Matches
---------- -------- -------
         1 test.txt {test1, test2, test3}
         2 test.txt {test3, test4}
         3 test.txt {test2}

答案 4 :(得分:3)

以上所有答案均不适用于我。下面做了。

Get-Content -Path $pathToFile | Select-String -Pattern "'test\d'" | foreach {$_.Matches.Value}

Get-Content -Path $pathToFile | # Get-Content will divide into single lines for us

Select-String -Pattern "'test\d'" | # Define the Regex

foreach {$ _。Matches.Value}#仅返回Object的Matches字段的值。 (这允许多个结果匹配。)

答案 5 :(得分:2)

您可以使用System.Text.RegularExpressions命名空间:

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

答案 6 :(得分:0)

如果不想使用 ForEach 运算符,则只能使用管道和 Select -Expand

例如,要仅获取 C:\ 之后的路径,您可以使用 :

Get-ChildItem | Select-String -Pattern "(C:\\)(.*)" | Select -Expand Matches | Select -Expand Groups | Where Name -eq 2 | Select -Expand Value

Where Name -eq 2 只选择指定的正则表达式模式的第二个匹配项。

答案 7 :(得分:0)

您可以使用更简单的 % 语法代替管道到 select.prop,它可以神奇地作用于多个元素:

(Select-String .-.-. .\test.txt -All).Matches.Value

或更少的括号:

$m = Select-String .-.-. .\test.txt -All
$m.Matches.Value