【问题标题】:How to remove multiple lines after string in powershell?如何在powershell中删除字符串后的多行?
【发布时间】:2015-09-05 18:20:52
【问题描述】:

我已经实习了几天,最近被要求编写一些 Powershell 脚本,我很高兴能学到一些新东西!

然而,这是一项耗时的任务,因为搜索东西很难找到你想要的东西。

无论如何,我的任务是从 word 文件中删除所有敏感数据。除了直到现在,情况还不算太糟。例如来自文本文件:

User pass created now moving on..
Password 7 ##########
All done

在文件中搜索“密码 7”和类似任务后,我不得不删除所有数字,这并没有花费我太长时间。

现在,我有一些固定长度的东西:

Self-Service certificate ####### ######## #######
######## ######## ######## ########## #########
########## ##### ######## ########## ##########

多行字符串。我可以删除第一行,但无法弄清楚下一行,因为它们只是随机数,我没有什么可搜索的。我尝试过nr \n \r 和许多组合。我被难住了。

$configFiles=get-childitem . *.txt -rec

foreach ($file in $configFiles)
{
 $readIn = @(Get-Content $file.PSPath) 
 $readIn -replace "Password 7.*" , "Password 7 <REMOVED>" -replace "Secret 5.*" , "Secret 5 <REMOVED>" -replace "snmp-server community\s\S*" , "snmp-server community <REMOVED>" |
 Set-Content $file.PSPath
 }

这是我当前的代码,到目前为止运行良好。我一直在一个单独的脚本中处理多行删除。感谢您的帮助。

【问题讨论】:

    标签: shell powershell replace scripting


    【解决方案1】:

    诀窍是将整个文本解析为单个字符串块,并构造一个正则表达式,可以检测嵌入在文本中的回车。

    默认情况下Get-Content 将返回一个以回车符分隔的字符串数组。要将测试作为单个文本 blob 加载,请使用 -Raw 参数:

    $readIn = Get-Content $file.PSPath  -Raw
    

    然后构造一个正则表达式,可以检测出你要删除的部分,回车等等。在此示例中,我假设敏感位是 13 个字符块,长度至少为 5 个字符,由空格或回车分隔:

    $readIn -replace 'Self-Service certificate (\S{5,}[\s\n]+){13}', "Self-Service certificate <removed>`n" | Set-Content $file.PSPath
    

    【讨论】:

    • 感谢您的回复,在我阅读您关于我必须做的事情的回复之前,它实际上已经打动了我。关于我的问题的更多信息是它是一个 17x8 的块和一个有 8 个字符然后是 4 个的附加行,就是这样。它从两个空格开始,然后是 8 个字符,然后是一个空格,然后是另一个 8,显然会重复直到达到 8。除了最后一行之外,所有 17 行都紧随其后。 $readIn -replace "^\s\s\w{8}\s\w{3,8}\s\w{8}\s\w{8}\s\w{8}\s\w{8}\s\w{8}\s\w{8}"我目前的工作到目前为止,我正试图让它适用于所有行。谢谢!
    【解决方案2】:

    听起来您正试图从 Cisco 配置中删除证书。

    $config = @"
    !
    crypto ca certificate chain TP-self-signed-12345678
    certificate self-signed 01
    3082022B 30820194 A0030201 02020101 300D0609 2A864886 F70D0101 04050030
    4F532D53 656C662D 5369676E 65642D43 65727469 66696361 74652D31 37363538
    528BD5A8 E7E26C51 10BAB609 5B60228F C8DE0299 7BE85C2D 9769FF05 C295706F
    3082022B 30820194 A0030201 02020101 300D0609 2A864886 F70D0101 04050030
    4F532D53 656C662D 5369676E 65642D43 65727469 66696361 74652D31 37363538
    528BD5A8 E7E26C51 10BAB609 5B60228F C8DE0299 7BE85C2D 9769FF05 C295706F
    3082022B 30820194 A0030201 02020101 300D0609 2A864886 F70D0101 04050030
    4F532D53 656C662D 5369676E 65642D43 65727469 66696361 74652D31 37363538
    528BD5A8 E7E26C51 10BAB609 5B60228F C8DE0299 7BE85C2D 9769FF05 C295706F
    quit
    Username joe password bloggs
    !
    "@
    
    $regex = [regex] '(?sm)certificate self-signed 01\s+([0-9A-F\s]+?)\s+quit'
    $result = $config | Select-String -Pattern $regex
    $cert = $result.Matches.Groups[1].Value
    $censored = $config -replace $cert, '<REMOVED>'
    Write-Output $censored
    

    输出:

    !
    crypto ca certificate chain TP-self-signed-12345678
    certificate self-signed 01
    <REMOVED>
    quit
    Username joe password bloggs
    !
    

    【讨论】:

    • 正是我想要做的,非常感谢你的回答!我现在将实现它并对其进行一些修改以适合我的版本。
    猜你喜欢
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2015-10-11
    • 2021-07-09
    • 2014-03-28
    • 2015-05-19
    相关资源
    最近更新 更多