我试图根据一个特定的字符串将一个大的文本文件分割成几个文件。每次我看到字符串ABCDE-3时,我都希望在一个新的文本文件中剪切并粘贴到该字符串的内容。我也想提取最后四个社会,姓和名。新的文本文件需要保存为first_name、last_name和社交网站的最后4个。
参见文本文件示例和一些初始代码。用Python做这件事会让我感觉更舒服,但是PowerShell是唯一的选择。
$my_text = Get-Content .\ab.txt
$ssn_pattern = '([0-8]\d{2})-(\d{2})-(\d{4})'
ForEach ($file in my_text)

发布于 2020-05-26 21:20:38
要获得社交网站的名字、姓氏和最后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.*我使用堆栈溢出帖子构造了一个代码片段,因此这可能会得到改进。它基本上是加载一个原始字符串,并得到所有的匹配。
然后循环遍历所有的匹配,并让组组装一个文件名,保存完整的匹配作为内容。
如果有包含空格的名称,并且不希望这些名称在文件名中,则可以用空字符串替换这些名称。
示例代码:
$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
}当我运行这个文件时,我得到了两个文件,每个匹配的内容如下:
MIOTTISAREMO2222.txt
MIOTTSANREMO1111.txthttps://stackoverflow.com/questions/62026167
复制相似问题