我有一个包含以下多个实例的文件:
<password encrypted="True">271NFANCMnd8BFdERjHoAwEA7BTuX</password>
但是对于每个实例,密码都是不同的。
我希望输出删除加密密码:
<password encrypted="True"></password>
使用PowerShell在文件中的模式的所有实例之间循环并输出到新文件的最佳方法是什么?
就像是:
gc file1.txt | (regex here) > new_file.txt
其中(这里的正则表达式)类似于:
s/"True">.*<\/pass//
最佳答案
在正则表达式中,这很容易,您可以那样做,也可以将其解析为实际的XML,这可能更合适。我将演示两种方式。在每种情况下,我们将从以下共同点开始:
$raw = @"
<xml>
<something>
<password encrypted="True">hudhisd8sd9866786863rt</password>
</something>
<another>
<thing>
<password encrypted="True">nhhs77378hd8y3y8y282yr892</password>
</thing>
</another>
<test>
<password encrypted="False">plain password here</password>
</test>
</xml>
"@
正则表达式
$raw -ireplace '(<password encrypted="True">)[^<]+(</password>)', '$1$2'
要么:
$raw -ireplace '(?<=<password encrypted="True">).+?(?=</password>)', ''
XML格式
$xml = [xml]$raw
foreach($password in $xml.SelectNodes('//password')) {
$password.InnerText = ''
}
仅替换加密的密码:
$xml = [xml]$raw
foreach($password in $xml.SelectNodes('//password[@encrypted="True"]')) {
$password.InnerText = ''
}
说明
正则表达式1
(<password encrypted="True">)[^<]+(</password>)
Debuggex Demo
第一个正则表达式方法使用2个捕获组来捕获开始和结束标签,并用这些标签替换整个匹配项(因此省略中间部分)。
正则表达式2
(?<=<password encrypted="True">).+?(?=</password>)
Debuggex Demo
第二种正则表达式方法使用正向先行和后向。它会找到1个或多个字符,这些字符的前面是开始标签,然后是结束标签。由于环顾处是零宽度,因此不属于匹配项,因此不会被替换。
XML格式
在这里,我们使用一个简单的xpath查询来查找所有
password
节点。我们使用foreach
循环遍历每个对象,并将其innerText
设置为空字符串。第二个版本检查加密属性是否设置为
True
,并且仅在这些属性上运行。选择哪个
我个人认为XML方法更合适,因为这意味着您不必过多考虑XML语法的变化。您还可以更轻松地说明节点上指定的不同属性或不同的属性值。
与使用正则表达式相比,使用xpath可以处理XML的灵活性更高。
文件操作
我注意到您的示例读取了
gc
(Get-Content
的缩写)使用的数据。请注意,这将逐行读取文件。您可以使用它来将原始内容转换为一个字符串,以转换为XML或通过正则表达式进行处理:
$raw = Get-Content file1.txt -Raw
您也可以很容易地将其写出:
$raw | Out-File file1.txt
关于regex - 如何使用PowerShell解析XML文件并删除两个标签之间的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716845/