Печать строк после одного и до другого совпадения в powershell - PullRequest
2 голосов
/ 15 января 2020

Я хочу напечатать несколько строк после некоторого совпадения и перед другим совпадением.

Используя awk, я сделал это так:

awk '/first match/{f=1} f; /second match/{f=0}'

Есть ли способ сделать это с PowerShell?

1 Ответ

0 голосов
/ 15 января 2020

Если вам нужно вывести вторую совпадающую строку, вы можете сделать следующее при чтении из файла:

(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 является следующий :

  1. Обрабатывать содержимое ввода в порядке, начиная с индекса 0 (строка 1).
  2. Ничего не захватывать до тех пор, пока не будет найдено первое совпадение (выражение оценивается как true).
  3. Захваченный вывод передается по каналу oop до тех пор, пока не будет найдено второе совпадение. Вывод включает в себя второе совпадение.
  4. Как только второе совпадение найдено, прекратите обработку данных.

В качестве альтернативы, если вам не нужно включать вторую совпадающую строку, код становится более кратким:

(gc file).Where({$_ -match 'first'},'SkipUntil').Where({$_ -match 'second'},'Until')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...