Расширенное регулярное выражение Powershell для выбора из файла - PullRequest
4 голосов
/ 10 мая 2011

Я хотел бы найти шаблон в файле, который я могу легко сделать с чем-то вроде:

gc $filename | select-string $pattern

Однако, как только я нашел этот первый шаблон, используя местоположение (линию) первого соответствия в качестве отправной точки, я бы хотел начать поиск второго шаблона. После того, как второй шаблон был найден, я бы хотел вернуть все строки между первым и вторым совпадениями, отбрасывая сами соответствующие строки.

Ответы [ 5 ]

2 голосов
/ 10 мая 2011

Скажем, ваш первый шаблон это pattern1, а второй шаблон это pattern2

, тогда выражение будет (?<=pattern1)(.*?)(?=pattern2)

(?<=pattern1) - это будет соответствовать префиксному шаблону, но исключит его из захвата1007 * (?=pattern2) - это будет соответствовать шаблону суффикса, но исключать его из захвата

1 голос
/ 10 мая 2011

Вот мой (французский 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 !...

Здесь текст между "кантоном" и "эндройтом"

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

Я соединяю все строки специальным символом "£" (выберите другой, если используется), затем использую шаблон @Alex Aza в CmdLet Select-String, затем снова разделяю.

1 голос
/ 10 мая 2011

Я использовал foreach с $foreach.Movenext():

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

Это просто возвращает каждую строку одну за другой, но вы можете делать то, что вам нравится в цикле do, если вам нужно каким-то образом обработать результат

1 голос
/ 10 мая 2011

Там может быть более элегантный способ, но это будет работать

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;
}
0 голосов
/ 10 мая 2011
$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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...