Чтобы получить имя, фамилию и последние 4 цифры социальной сети, вы можете использовать группы захвата и использовать эти группы при составлении имени файла.
Из вашего шаблона должны быть только последние 4 цифры быть сгруппированным.
Вы можете использовать шаблон, чтобы начать сопоставление с TO: и из следующей строки получите значения для имен и номера.
Затем сопоставьте все строки, которые не начинаются с ABCDE - 3 с использованием отрицательного просмотра вперед (?!
Вы можете настроить шаблон и код в соответствии с вашим точным текстом.
(?m)^[^\S\r\n]+TO:.*\r?\n\s*ATTN:\s*[A-Z]{3} ([^,\r\n]+),[^\S\r\n]*(.+?)[^\S\r\n]*[0-8]\d{2}-\d{2}-(\d{4})(?:\r?\n(?![^\S\r\n]+ABCDE - 3).*)*\r?\n[^\S\r\n]+ABCDE - 3.*
Regex demo
Я создал фрагмент кода, используя проводки stackoverflow, так что это можно улучшить. В основном это сводится к загрузке необработанной строки и получению всех совпадений.
Затем l oop по всем совпадениям и заставляет группы собрать имя файла и сохранить полное совпадение в качестве содержимого.
Если есть имена, содержащие пробелы, и вы не хотите, чтобы они присутствовали в имени файла, вы можете заменить их пустой строкой.
Пример кода:
$my_text = Get-Content -Raw ./Documents/stack-overflow/powershell/ab.txt
$pattern = "(?m)^[^\S\r\n]+TO:.*\r?\n\s*ATTN:\s*[A-Z]{3} ([^,\r\n]+),[^\S\r\n]*(.+?)[^\S\r\n]*[0-8]\d{2}-\d{2}-(\d{4})(?:\r?\n(?![^\S\r\n]+ABCDE - 3).*)*\r?\n[^\S\r\n]+ABCDE - 3.*"
Select-String $pattern -input $my_text -AllMatches |
ForEach-Object { $_.Matches } |
ForEach-Object {
$fileName = -join ($_.groups[2].Value, $_.groups[1].Value, $_.groups[3].Value)
Write-Host $fileName
Set-Content -Path "your-path-here/$fileName.txt" -Value $_.Value
}
Когда я запускаю это, я получаю 2 файла с содержимым для каждого совпадения:
MIOTTISAREMO2222.txt
MIOTTSANREMO1111.txt