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

StackOverflow https://stackoverflow.com/questions/804754

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Например:

Если бы я это сделал

select-string .-.-.

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

abc 1-2-3 abc

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

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

Это было полезно?

Решение

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

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

Другие советы

Или просто:

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

Я попробовал другой подход:Select-String возвращает совпадения свойств, которые могут быть использованы.Чтобы получить все совпадения, вы должны указать -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

Выберите строку в technet.microsoft.com

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

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

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

Например:на примере стейя:

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}

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

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 {$_.Матчи.Value} # возвращает только значение поля Совпадений объекта.(Это допускает совпадение нескольких результатов.)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top