Как мне вернуть только соответствующее регулярное выражение при выборе-string(grep) в PowerShell?
-
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
В духе научи мужчину ловить рыбу ...
То, что вы хотите сделать, это передать выходные данные вашей команды 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