8

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

4 回答 4

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
于 2013-06-03T13:40:08.167 回答
3

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

$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
于 2013-06-03T13:55:15.627 回答
2

在PowerShell v3 中:

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

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

% matches 选择所有匹配项,而不考虑文件等。% value 选择每个匹配项的值

于 2013-06-25T21:46:38.743 回答
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].

于 2013-06-03T17:37:03.077 回答