Powershell中的模拟命令grep -o

时间:2013-06-03 13:30:27

标签: powershell grep

Powershell中的哪个命令替换了grep -o(它只显示一行的匹配部分而不是整行)? 我尝试使用Select-Object但它总是显示实线。 例如:

下一行

<a id="tm_param1_text1_item_1" class="tm_param1param2_param3 xxx_zzz qqq_rrrr_www_vv_no_empty" >eeee <span id="ttt_xxx_zzz">0</span></a>

使用下一个命令:

cat filename  | grep -o '>[0-9]' | grep -o '[0-9]'

输出:0

当我使用Select-Object时,我总能看到整行(

4 个答案:

答案 0 :(得分:5)

一种方法是:

$a = '<a id="tm_param1_text1_item_1" class="tm_param1param2_param3 xxx_zzz qqq_rrrr_www_vv_no_empty" >eeee <span id="ttt_xxx_zzz">0</span></a>'

$a -match '>([0-9])<' #returns true and populate the $matches automatic variable

$matches[1] #returns 0

答案 1 :(得分:3)

要在文字中选择字符串,请使用select-string而不是select-object。它将返回一个MatchInfo对象。您可以通过查询匹配属性来访问匹配项:

$a = '<a id="tm_param1_text1_item_1" class="tm_param1param2_param3 xxx_zzz qqq_rrrr_www_vv_no_empty" >eeee <span id="ttt_xxx_zzz">0</span></a>'
($a | select-string '>[0-9]').matches[0].value # returns >0

答案 2 :(得分:1)

到目前为止提出的解决方案仅从每一行产生第一个匹配。要完全模拟grep -o(从每行产生每个匹配)的行为,需要这样的事情:

Get-Content filename | Select-String '>([0-9])' -AllMatches |
  Select-Object -Expand Matches | % { $_.Groups[1].Value }

Select-String -AllMatches返回输入字符串中的所有匹配项。

Select-Object -Expand Matches“断开”来自同一行的匹配,以便可以通过$_.Groups[1]选择所有子匹配。如果没有此扩展,则来自第二行匹配的子匹配将为$_.Groups[3]

答案 3 :(得分:1)

InPowerShell v3:

sls .\filename -pattern '^[0-9]' -AllMatches  | % matches | % value

说明: sls是Select-String的别名。它需要文件名/路径以及模式作为参数。它产生“匹配”

%匹配选择所有匹配,无论文件等。 %值选择每个匹配的值