Экземпляры Microsoft.PowerShell.Commands.MatchInfo
, которые выходят Select-String
, имеют свойство a Pattern
, которое отражает конкретный образец c среди (потенциальных) массив шаблонов, переданных в -Pattern
, который соответствует в данной строке .
предостережение - это if совпадение нескольких шаблонов, .Pattern
сообщает только шаблон среди совпавших, который указан первый среди них в -Pattern
аргументе .
Вот простой пример, использующий массив строк для имитации строк из файлов в качестве входных:
'A fool and',
'his barn',
'are soon parted.',
'foo and bar on the same line' |
Select-String -Pattern ('bar', 'foo') |
Select-Object Line, LineNumber, Pattern
Результат выше:
Line LineNumber Pattern
---- ---------- -------
A fool and 1 foo
his barn 2 bar
foo and bar on the same line 4 bar
Обратите внимание, что 'bar'
отображается как значение Pattern
для последней строки, даже если 'foo'
появилось первым в строке ввода , потому что 'bar'
стоит перед 'foo'
в массиве шаблонов .
Чтобы отразить фактический шаблон, который появляется первым в строке ввода в свойстве Pattern
, требуется дополнительная работа:
Сформулируйте свой массив шаблонов как одиночное регулярное выражение с использованием чередования (|
), заключенного в виде целого в группу захвата ((...)
) - например, '(bar|foo)'
)
- Примечание: выражение, используемое ниже,
'({0})' -f ('bar', 'foo' -join '|')
, создает это регулярное выражение динамически из массива (здесь литерал массива 'bar', 'foo'
, но можно подставить любую переменную массива или даже (Get-Content $inputFile)
); если вы хотите обрабатывать входные шаблоны как литералы и они содержат метасимволы регулярных выражений (например, .
), вам нужно сначала экранировать их с помощью [regex]::Escape()
.
Используйте вычисляемое свойство, чтобы определить настраиваемое свойство Pattern
, которое сообщает значение группы захвата, которое является первым среди значений, встречающихся в каждой строке ввода:
'A fool and',
'his barn',
'are soon parted.',
'foo and bar on the same line' |
Select-String -AllMatches -Pattern ('({0})' -f ('bar', 'foo' -join '|')) |
Select-Object Line, LineNumber,
@{ n='Pattern'; e={ $_.Matches[0].Groups[1].Value } }
Это дает (сокращенно, чтобы показать только последнее совпадение):
Line LineNumber Pattern
---- ---------- -------
...
foo and bar on the same line 4 foo
Теперь 'foo'
правильно отображается как совпадающий шаблон.
К сообщать все шаблоны, найденные в каждой строке :
Переключатель -AllMatches
необходим, чтобы сообщить Select-String
найти все совпадения в каждой строке, представленные в коллекции .Matches
объектов вывода MatchInfo
.
Затем необходимо перечислить коллекцию .Matches
(через .ForEach()
метод сбора) для извлечения значения группы захвата из каждого совпадения.
'A fool and',
'his barn',
'are soon parted.',
'foo and bar on the same line' |
Select-String -AllMatches -Pattern ('({0})' -f ('bar', 'foo' -join '|')) |
Select-Object Line, LineNumber,
@{ n='Pattern'; e={ $_.Matches.ForEach({ $_.Groups[1].Value }) } }
Это дает (сокращенно, чтобы показать только последнее совпадение):
Line LineNumber Pattern
---- ---------- -------
...
foo and bar on the same line 4 {foo, bar}
Обратите внимание, что и 'foo'
, и 'bar'
теперь сообщаются в Pattern
в том порядке, в котором они встречаются в строке.