Как сопоставить 3 строки в текстовом файле и извлечь строку в средней строке - PullRequest
0 голосов
/ 19 июня 2019

Используя Powershell, я хотел бы извлечь значение из текстового файла, который находится между двумя строками, которые соответствуют шаблону.

Я пытаюсь сопоставить 3 строки, 1-я и 3-я всегда будут одинаковыми:

1st: '  1'
2nd: trying to read... always 2-4 characters
3rd: ' 40'

Есть несколько случаев, когда строки 1 и 3 должны соответствовать этому.

Я пытался с приведенным ниже кодом.

$aa=Get-Content $filename1 -Raw
$aaa=$aa  |Where-Object { ( $_ -match '(.\s1)(?:\r\n|[\r\n])*(?:\r\n|[\r\n])(\s40)') }
$aaa

Я получаю слишком много выходных данных ... возможно, это соответствует только 1-й и 3-й строке и множеству строк между ними.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вы можете сделать это с помощью регулярных выражений:

$regex = [regex] '\s+1\r?\n(?<secondline>.*)\r?\n\s+40'
$match = $regex.Match($text)
$result = while ($match.Success) {
    $match.Groups['secondline'].Value
    $match = $match.NextMatch()
} 

$result

Где $text - это файл, который вы прочитали с $text = Get-Content 'FILENAME' -Raw, например:

  1
trying to read... always 2-4 characters
 40
  1
another second line
 40
  1
the line you are interested in
 40

Результат

trying to read... always 2-4 characters
another second line
the line you are interested in
0 голосов
/ 19 июня 2019

Regex обычно является плохой заменой контекстно-зависимого многострочного парсера.

Учитывая формат документа, я просто написал бы один:

$grabLine = $false

switch -File($filename1){
  '  1' {
    $grabLine = $true
  }
  ' 40' {
    $grabLine = $false
  }
  default{
    if($grabLine){
      $_
      # break here if you only need one line 
    }
  }
}
...