Powershell高级正则表达式从文件中进行选择



我想在文件中搜索一个模式,我可以很容易地做到:

GC $filename |选择字符串$pattern

然而,一旦我找到了第一个模式,以第一个匹配的位置(线)为起点,我想开始寻找第二个模式。一旦第二个模式被匹配,我想返回第一个和第二个匹配之间的所有行,丢弃匹配的行本身。

假设您的第一个模式是模式 1,第二个模式是模式 2

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

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

可能有更优雅的方法,但这将起作用

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;
}

我已经将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中做自己喜欢的事情

这是我

的一个(法国拼凑;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 !...

这是"州"和"endroit"之间的文字

PS > (((Get-Content -Path C:tempgorille.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

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

$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)]

相关内容

  • 没有找到相关文章