【问题标题】:PowerShell - Find and replace multiple patterns to anonymize filePowerShell - 查找和替换多个模式以匿名文件
【发布时间】:2020-11-08 17:03:16
【问题描述】:

我需要你的帮助。我有一个 log.txt 文件,其中包含我必须匿名的各种数据。 我想检索与预定义模式匹配的所有这些“字符串”,并将它们替换为每个值的另一个值。重要的是来自相同模式的每个新字符串(并且具有与前一个不同的值)应该被预定义的值替换为+1(例如“orderID = 123ABC”变为“orderID = order1”和“orderID = 456ABC " 变成 "orderID=order2")。
要搜索的模式超过 20 个,因此不可能将它们全部放在一行中。 我的想法是:

  1. 定义“patterns.txt”文件
  2. 定义“replace.txt”文件(“pattern”值和替换值)
  3. 在日志文件中搜索所有“patterns”,结果为ARRAY
  4. 在该 ARRAY 中查找唯一条目
  5. 获取 ARRAY 中每个唯一条目的“替换”值
  6. 替换 log.txt 中的所有匹配项。这里棘手的部分是任何出现的相同类型(但与前一个不同的值)都需要增加 (+1) 才能与之前的不同。

我所拥有的示例:

requestID>qwerty1-qwerty2-qwerty3
requestID>12345a-12345b-12345c
requestID>qwerty1-qwerty2-qwerty3
requestID>qwerty1-qwerty2-qwerty3
orderID>012345ABCDE
orderID>012345ABCDE
orderID>ABCDE012345
orderID>ABCDE012345
keyId>XYZ123
keyId>ABC987
keyId>XYZ123

想要的结果:

requestID>Request-1
requestID>Request-2
requestID>Request-1
requestID>Request-1
orderID>Order-1
orderID>Order-1
orderID>Order-2
orderID>Order-2
keyId>Key-1
keyId>Key-2
keyId>Key-1

目前我只能找到每种类型的唯一值:

$N = "C:\FindAndReplace\input.txt"
$Patterns = "C:\FindAndReplace\pattern.txt"
(Select-String $N -Pattern 'requestID>\w{6}-\w{6}-\w{6}</requestID>').Matches.Value | Sort-Object -Descending -Unique
(Select-String $N -Pattern '<orderID>\w{20}</orderID>').Matches.Value | Sort-Object -Descending -Unique
(Select-String $N -Pattern '<keyId>\w{8}</keyId>').Matches.Value | Sort-Object -Descending -Unique

提前感谢您对如何进行的任何建议。

【问题讨论】:

    标签: powershell replace find


    【解决方案1】:

    您的模式与您的示例数据不匹配。我已经更正了模式以适应实际的样本数据。

    似乎每个类型的简单哈希表可以满足跟踪匹配和计数的需要。如果我们使用-Regex-File 参数处理带有switch 语句的日志文件,我们可以一次处理每一行。每个的逻辑是

    • 检查当前匹配是否存在于特定类型的匹配数组中。
      • 如果没有,请将其与替换值(类型计数)和增量计数相加。
      • 如果确实存在,请使用已定义的替换值。
    • 捕获变量中的所有输出,然后在完成后将其写入文件。

    创建示例日志文件

    $log = New-TemporaryFile
    
    @'
    <requestID>qwerty1-qwerty2-qwerty3</requestID> -match 
    <requestID>12345a-12345b-12345c</requestID>
    <requestID>qwerty1-qwerty2-qwerty3</requestID>
    <requestID>qwerty1-qwerty2-qwerty3</requestID>
    <orderID>012345ABCDE</orderID>
    <orderID>012345ABCDE</orderID>
    <orderID>ABCDE012345</orderID>
    <orderID>ABCDE012345</orderID>
    <keyId>XYZ123</keyId>
    <keyId>ABC987</keyId>
    <keyId>XYZ123</keyId>
    '@ | Set-Content $log -Encoding UTF8
    

    为包含计数和匹配数组的每种类型定义“跟踪器”变量

    $Request = @{
        Count   = 1
        Matches = @()
    }
    $Order = @{
        Count   = 1
        Matches = @()
    }
    $Key = @{
        Count   = 1
        Matches = @()
    }
    

    逐行读取和处理日志文件

    $output = switch -Regex -File $log {
        '<requestID>(\w{6,7}-\w{6,7}-\w{6,7})</requestID>' {
            if(!$Request.matches.($matches.1))
            {
                $Request.matches += @{$matches.1 = "Request-$($Request.count)"}
                $Request.count++
            }
            $_ -replace $matches.1,$Request.matches.($matches.1)
        }
        '<orderID>(\w{11})</orderID>' {
            if(!$Order.matches.($matches.1))
            {
                $Order.matches += @{$matches.1 = "Order-$($Order.count)"}
                $Order.count++
            }
            $_ -replace $matches.1,$Order.matches.($matches.1)
        }
        '<keyId>(\w{6})</keyId>' {
            if(!$Key.matches.($matches.1))
            {
                $Key.matches += @{$matches.1 = "Key-$($Key.count)"}
                $Key.count++
            }
            $_ -replace $matches.1,$Key.matches.($matches.1)
        }
        default {$_}
    }
    
    $output | Set-Content $log -Encoding UTF8
    

    $log 文件现在包含

    <requestID>Request-1</requestID>
    <requestID>Request-2</requestID>
    <requestID>Request-1</requestID>
    <requestID>Request-1</requestID>
    <orderID>Order-1</orderID>
    <orderID>Order-1</orderID>
    <orderID>Order-2</orderID>
    <orderID>Order-2</orderID>
    <keyId>Key-1</keyId>
    <keyId>Key-2</keyId>
    <keyId>Key-1</keyId>
    

    【讨论】:

    • 谢谢道格,这正是我所需要的。现在作为进一步的步骤,我怎样才能拥有在匿名化过程中生成的文件,其中包含原始数据和相应的匿名值(例如 XYZ123Key-1 )?在这个文件/表格的帮助下,我怎样才能恢复到原始值?非常感谢!
    • 为了不把这篇文章弄得乱七八糟,不如你开始一个新的问题来引用这个问题。
    • 但一个简单的答案是您已经拥有每个哈希表中的数据。匹配是键,替换是值。
    • 嗨,Doug,按照建议,我打开了新问题:stackoverflow.com/questions/64901869/…。您的反馈将不胜感激。
    • Mathias 要求提供一些信息。你能提供给他吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2013-01-29
    • 2014-08-22
    相关资源
    最近更新 更多