Если вам нужно вывести вторую совпадающую строку, вы можете сделать следующее при чтении из файла:
(Get-Content file).Where({$_ -match 'first'},'SkipUntil') | Foreach-Object {
if ($_ -match 'second') {
$_; break
}
else {
$_
}
}
Если у вас есть переменная ($content
) с массивом строк, вы может делать следующее:
$content.Where({$_ -match 'first'},'SkipUntil') | Foreach-Object {
if ($_ -match 'second') {
$_; break
}
else {
$_
}
}
Объяснение:
Метод Where()
поддерживает выражение и режим. Выражение, обозначенное блоком сценария {}
, выполняется для каждого объекта конвейера. Если ваш ввод является массивом, $_
будет содержать содержимое каждой строки.
-match
по умолчанию выполняет сопоставление с учетом регистра без учета регистра.
Режим SkipUntil
означает не выводите ничего, пока выражение не станет истинным. Затем продолжайте вывод до тех пор, пока все данные не будут обработаны.
Когда будет найдено второе совпадение, эта строка будет выведена, а остальные строки перестанут обрабатываться.
Основным рабочим процессом c является следующий :
- Обрабатывать содержимое ввода в порядке, начиная с индекса 0 (строка 1).
- Ничего не захватывать до тех пор, пока не будет найдено первое совпадение (выражение оценивается как true).
- Захваченный вывод передается по каналу oop до тех пор, пока не будет найдено второе совпадение. Вывод включает в себя второе совпадение.
- Как только второе совпадение найдено, прекратите обработку данных.
В качестве альтернативы, если вам не нужно включать вторую совпадающую строку, код становится более кратким:
(gc file).Where({$_ -match 'first'},'SkipUntil').Where({$_ -match 'second'},'Until')