Подтвердить что ты не робот

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

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

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

Например:

Если я сделал

select-string .-.-.

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

abc 1-2-3 abc

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

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

4b9b3361

Ответ 1

Давид на правильном пути. [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}

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

Ответ 2

Или просто:

Select-String .-.-. .\test.txt -All | Select Matches

Ответ 3

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

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

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

script:

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

Выбрать-String на technet.microsoft.com

Ответ 4

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

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

Мое предложение - использовать что-то вроде: select linenumber, filename, 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}