Как вернуть только совпадающее регулярное выражение, когда я выбираю строку (grep) в PowerShell? - PullRequest
36 голосов
/ 30 апреля 2009

Я пытаюсь найти шаблон в файлах. Когда я получаю совпадение, используя Select-String, я не хочу всю строку, я просто хочу ту часть, которая соответствует.

Есть ли параметр, который я могу использовать для этого?

Например:

Если бы я сделал

select-string .-.-.

и файл содержит строку с:

abc 1-2-3 abc

Я бы хотел получить результат всего лишь 1-2-3 вместо всей возвращаемой строки.

Я хотел бы знать, что Powershell эквивалентен grep -o

Ответы [ 6 ]

37 голосов
/ 01 мая 2009

Или просто:

Select-String .-.-. .\test.txt -All | Select Matches
26 голосов
/ 30 апреля 2009

Дэвид на правильном пути. [regex] - это ускоритель типов для System.Text.RegularExpressions.Regex

[regex]$regex = '.-.-.'
$regex.Matches('abc 1-2-3 abc') | foreach-object {$_.Value}
$regex.Matches('abc 1-2-3 abc 4-5-6') | foreach-object {$_.Value}

Вы можете обернуть это в функцию, если она слишком многословна.

18 голосов
/ 30 апреля 2009

Я попробовал другой подход: Select-String возвращает свойство Matches, которое можно использовать. Чтобы получить все совпадения, вы должны указать -AllMatches. В противном случае возвращается только первый.

Содержимое моего тестового файла:

test test1 alk atest2 asdflkj alj test3 test
test test3 test4
test2

Сценарий:

select-string -Path c:\temp\select-string1.txt -Pattern 'test\d' -AllMatches | % { $_.Matches } | % { $_.Value }

возвращает

test1 #from line 1
test2 #from line 1
test3 #from line 1
test3 #from line 2
test4 #from line 2
test2 #from line 3

Select-String на technet.microsoft.com

11 голосов
/ 30 апреля 2009

В духе научить человека ловить рыбу ...

То, что вы хотите сделать, это передать вывод вашей команды select-string в Get-member , чтобы вы могли видеть, какие свойства имеют объекты. Как только вы это сделаете, вы увидите «Совпадения», и вы можете выбрать именно это, отправив свой вывод на | **Select-Object** Matches.

Я предлагаю использовать что-то вроде: выберите номер белья, имя файла, совпадения

Например: по образцу Stej:

sls .\test.txt -patt 'test\d' -All |select lineNumber,fileName,matches |ft -auto

LineNumber Filename Matches
---------- -------- -------
         1 test.txt {test1, test2, test3}
         2 test.txt {test3, test4}
         3 test.txt {test2}
3 голосов
/ 25 июня 2018

Ни один из приведенных выше ответов не работал для меня. Ниже сделал.

Get-Content -Path $pathToFile | Select-String -Pattern "'test\d'" | foreach {$_.Matches.Value}

Get-Content -Path $pathToFile | # Get-Content will divide into single lines for us

Select-String -Pattern "'test\d'" | # Define the Regex

foreach {$ _. Matches.Value} # только возвращает значение поля соответствий объекта. (Это допускает несколько совпадений результатов.)

2 голосов
/ 30 апреля 2009

Вы можете использовать пространство имен System.Text.RegularExpressions:

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...