Поиск шаблона регулярных выражений с помощью PowerShell и выходного имени файла - PullRequest
0 голосов
/ 02 апреля 2020
$input_path = "d:\txt\*.txt"
$output_file = 'd:\out.txt'
$regex = "\w* (\w\.? )?\w* (was )?[B|b]orn .{100}"
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file

Здесь начинающий Powershell. Я бы хотел, чтобы l oop прошел через все файлы в указанном каталоге c, выполнил поиск по заданному шаблону регулярных выражений c и вывел результаты в файл. До сих пор мне удалось решить вышеизложенное. Как я могу также вывести имя файла для каждого совпадения?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете сделать следующее:

$input_path = "d:\txt\*.txt"
$output_file = 'd:\out.txt'
$regex = "\w* (\w\.? )?\w* (was )?[B|b]orn .{100}"
Select-String -Path $input_path -Pattern $regex -AllMatches | Foreach-Object {
    $currentMatches = $_
    $_.Matches | Foreach-Object { $_.Value,$currentMatches.Filename -join ' | ' } |
        Add-Content $output_file
}

Объяснение:

Select-String вернет коллекцию MatchInfo объектов. Каждый из этих объектов имеет свойство Filename, которое содержит только имя файла, содержащего совпадения. Поскольку в одном файле может быть несколько совпадений (из-за -AllMatches), необходимо выполнить итерацию каждого совпадения в объекте MatchInfo.

Оператор -join объединяет все элементы в коллекции с определенным разделителем строк.

1 голос
/ 02 апреля 2020

Итак, для вашей последней строки используйте:

# put matches into var
$matches = Select-String -Path $input_path -Pattern $regex -AllMatches
# write out to file
foreach ($m in $matches) { $m.Filename | Out-File $output_file -Append -NoClobber }
...