【问题标题】:Powershell advanced regex to select from filePowershell 高级正则表达式从文件中选择
【发布时间】:2011-08-22 02:46:19
【问题描述】:

我想在文件中搜索一个模式,我可以通过以下方式轻松完成:

gc $文件名 |选择字符串 $pattern

但是,一旦我找到了第一个模式,使用第一个匹配的位置(线)作为起点,我想开始搜索第二个模式。一旦匹配了第二个模式,我想返回第一个和第二个匹配之间的所有行,丢弃匹配的行本身。

【问题讨论】:

  • 你能提供一个你需要的输入和输出的例子吗?
  • Windows ini 文件与我尝试解析的文件类型非常接近

标签: regex file select powershell


【解决方案1】:

假设您的第一个模式是 pattern1,第二个模式是 pattern2

那么表达式将是(?<=pattern1)(.*?)(?=pattern2)

(?<=pattern1) - 这将匹配前缀模式但将其从捕获中排除
(?=pattern2) - 这将匹配后缀模式但将其从捕获中排除

【讨论】:

    【解决方案2】:

    可能有更优雅的方式,但这会奏效

    function ParseFile
    {
        param([string] $FileName)
        $s = gc $FileName;
        for($x = 0 ;   $X -lt $s.count; $x++)
        {
            if(-not $first ){ 
                if($s[$x] -match "1000"){
                    $first =$x
                }
            } 
            else{
                if($s[$x] -match "1075"){
                    $second = $x ; 
                    break;
                } 
           }
    
        }
        (($first +1) .. ($second -1))|%{
            $ret += $s[$_]
        }
        return $ret;
    }
    

    【讨论】:

      【解决方案3】:

      我用foreach$foreach.Movenext():

      foreach ($line in (Get-Content $file))
      {
          if ($line -match $firstTag)
          {
              do {
                  $line
                  $foreach.MoveNext()
              } until ($foreach.current -match $secondTag)
              continue
          }
      }
      

      这将简单地逐一返回每一行,但如果您需要以某种方式处理结果,您可以在 do-loop 中做您喜欢的事情

      【讨论】:

        【解决方案4】:

        这是我的一个(法国 bricolage ;o)),想象一下文件 c:\temp\gorille.txt:

        C'est à travers de larges grilles,
        Que les femelles du canton,
        Contemplaient un puissant gorille,
        Sans souci du qu'en-dira-t-on.
        Avec impudeur, ces commères
        Lorgnaient même un endroit précis
        Que, rigoureusement ma mère
        M'a défendu de nommer ici...
        Gare au gorille !...
        

        这里是“canton”和“endroit”之间的文字

        PS > (((Get-Content -Path C:\temp\gorille.txt) -join "£" | Select-String -Pattern "(?=canton)(.*)(?<=endroit)").matches[0].groups[0].value) -split "£"
        canton,
        Contemplaient un puissant gorille,
        Sans souci du qu'en-dira-t-on.
        Avec impudeur, ces commères
        Lorgnaient même un endroit
        

        我用特殊字符“£”连接所有行(如果使用,请选择另一个),然后在 CmdLet Select-String 中使用@Alex Aza 模式,然后再次拆分。

        【讨论】:

          【解决方案5】:
          $start = select-string -Path $path -pattern $pattern1 -list |
            select -expand linenumber
          
          $end = select-string -path $path -pattern $pattern2 |
            where-object {$_.linenumber -gt $start} |
            sort linenumber -desc |
            select -first 1 -expand linenumber
          
           (get-content $path)[$start..($end -2)]
          

          【讨论】:

            猜你喜欢
            • 2023-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多