powershell -replace只替换最后一场比赛

时间:2013-01-15 09:53:51

标签: regex powershell replace

我需要这个正则表达式的帮助。我得到一个像下面的字符串。我想要像

这样的东西

ServerName:AdminServer RUNNING
ServerName:ServicesServer1 RUNNING

$rv="xxx ServerName: AdminServer  RUNNING  xxxx ServerName: ServicesServer1  RUNNING xxx"
$rv -replace ".*(ServerName: [A-Za-z0-9]*.*[RUNNING|SHUTDOWN])",'$1'
ServerName: ServicesServer1  RUNNING xxx

凭借我现在所拥有的最后一场比赛?

编辑:

$rv="xxx ServerName: AdminServer  RUNNING  xxxx ServerName: ServicesServer1  RUNNING 
$rv -replace ".*(ServerName: [A-Za-z0-9]*.*RUNNING|SHUTDOWN)",'$1'

给出

ServerName: ServicesServer1  RUNNING xxx

不是

ServerName: AdminServer  RUNNING
ServerName: ServicesServer1  RUNNING

EDIT2: 事实证明我已经简化了这一点。字符串看起来更像是这样:

$rv='XXX rtification Authority - G3,OU=(c) 2008 GeoTrust Inc. - For authorized use only,O=GeoTrust Inc.,C=US". The loading of the trusted certificate list raised a certificate parsing exception PKIX: Unsupported OID in the AlgorithmIdentifier object: 1.2.840.113549.1.1.11.>
Successfully Connected to Node Manager.
ServerName: SasTTpcAdminServer

RUNNING

Successfully disconnected from Node Manager.
Connecting to Node Manager ...
Successfully Connected to Node Manager.
ServerName: XXXServicesServer1

RUNNING

Successfully disconnected from Node Manager.'

3 个答案:

答案 0 :(得分:2)

试试这个:

 [regex]::Matches($rv, "(ServerName: [A-Za-z0-9]*.*?(?:RUNNING|SHUTDOWN))") | select -expa value

($rv | select-string -Pattern "(ServerName: [A-Za-z0-9]*.*?(?:RUNNING|SHUTDOWN))" -AllMatches ).matches | select -expa value

答案 1 :(得分:1)

虽然这不一定是一种理想的方法,但在解决一些问题后它会“起作用”:

  1. [RUNNING|SHUTDOWN]是一个字符calss,而不是aliteration。将其切换为(?:RUNNING|SHUTDOWN)

  2. .*匹配过于贪婪。请改用.*?

  3. 决赛:

    $rv -replace ".*?(ServerName: [A-Za-z0-9]*.*?(?:RUNNING|SHUTDOWN))", '$1'
    

    注意它与最后一位不匹配..但是,可能有更好的解决方案(请注意,这使用了之前讨论的修复和我自己的一些调整):

    $r = [regex]::matches($rv,"(ServerName:.*?\w+.*?(?:RUNNING|SHUTDOWN))")
    $r[0].Value
    # -> ServerName: AdminServer  RUNNING
    

    然后我们可以将捕获组值映射到更简单的东西:

    $r | % { $_.Value }
    # -> 
    # ServerName: AdminServer  RUNNING
    # ServerName: ServicesServer1  RUNNING
    

答案 2 :(得分:0)

试试这个:

$rv -replace '[\s\S]*?(ServerName: \w+)[\s\S]*?((RUNNING|STOPPED).*\n)[\s\S]*?(?(?=ServerName)[\s\S]*?|.*$)', '$1 $2'

对我来说很好。 :)