Как вернуть только подходящее регулярное выражение, когда я выбираю-строку (grep) в PowerShell?
Я пытаюсь найти шаблон в файлах. Когда я получаю совпадение с помощью Select-String
, мне не нужна вся строка, я просто хочу, чтобы часть соответствовала.
Есть ли параметр, который я могу использовать для этого?
Например:
Если я сделал
select-string .-.-.
и файл содержит строку с:
abc 1-2-3 abc
Я хочу получить результат только 1-2-3 вместо всей возвращаемой строки.
Я хотел бы знать эквивалент Powershell a grep -o
Ответы
Ответ 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}
Ответ 5
Вы можете использовать пространство имен System.Text.RegularExpressions:
http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx