如何在powershell中删除字符串之后的多行?

时间:2015-06-19 17:12:51

标签: shell powershell replace scripting

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

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

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

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

在搜索文件后,我必须删除所有号码"密码7"和类似的任务并没有花太多时间。

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

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

多行上的字符串。我可以删除顶行,但无法找出下一行,因为它们只是随机数,我没有任何东西可以搜索。我尝试了n r \ 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
 }

这是我目前的代码,到目前为止运行良好。我一直在单独的脚本中搞乱多行删除。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

听起来您正试图从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
!

答案 1 :(得分:0)

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

默认情况下,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